《程序设计方法学》实验报告-算术表达式求值(3)

2019-01-19 17:47

SElemType *top; int stacksize; }SqStack;

void InitStack (SqStack &S)//构造一个空栈 {

S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));//分配储存空间 if(!S.base) exit (-1); //空间分配失败 S.top=S.base;

S.stacksize=STACK_INIT_SIZE; //空间初始分配 }//InitStack

bool GetTop (SqStack S,SElemType &e)

{ //若栈不空,则用e返回S的栈顶元素,并返回true;否则返回false if(S.top==S.base) return false; e=*(S.top-1); return true; }//GetTop

bool Push(SqStack &S,SElemType e) { //插入元素为e的新的栈顶元素 if(S.top-S.base>=S.stacksize) { //栈满,追加存储空间

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base)

exit(-1); //存储空间分配失败

S.top=S.base+S.stacksize;//此处内存有可能重新分配,S.base地址有可能会变,此句不能省 S.stacksize+=STACKINCREMENT; }

*S.top++=e;//top自增 return true;

}// Push

bool Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,用e返回其值 {

if(S.top==S.base) return false;

e=*--S.top; //删除一个元素,top减一 ?????????????????? return true ; }// Pop

/////////////////////////////////////////////////////////////////////////////////////////////////

/*以下为判断符号优先级的函数*/

char Precede(char a1 ,char a2)//判定运算符的优先级。 { //根据课本p53页的表3.1 char r; switch(a2) {

case'+': //此处由于加减几乎优先级一样,故放在一起 case'-':

if(a1=='('||a1=='#') r='<'; else

r='>'; break;

case'*': //此处由于乘除优先级一样,故放在一起 case'/':

if(a1=='*'||a1=='/'||a1==')') r='>'; else r='<'; break; case'(': if(a1==')') {

cout<<\括号匹配错误!\ exit(-1); } else r='<'; break; case')': if(a1=='(') r='='; else if(a1=='#') {

cout<<\没有左括号\ exit (-1); } else r='>'; break; case'#': switch(a1) { case'#': r='='; break;

case'(':

cout<<\没有右括号\ exit(-1); default: r='>'; }//switch break; }//switch return r; }//Precede

//////////////////////////////////////////////////////////////////////////////// /*判断是否为操作符的函数*/ bool In(char d)//判断c是否为七种运算符之一 { switch(d) { case'+': case'-': case'*': case'/': case'(': case')': case'#': return true; default: return false; }//switch }

/////////////////////////////////////////////////////////////////////////////// /*以下为 运算函数*/

SElemType Operate( SElemType a, SElemType theta, SElemType b )//Operate为进行二元运算的a theta b的函数

{

char n=char(theta);//此处把double型强制转换成int型,虽然会造成精度缺失,但本身theta是一个符号,也算是整型

switch(n) //转换后相当于和符号匹配ACSII码 { case'+': return a+b; case'-': return a-b; case'*': return a*b; default: if(b!=0) return a/b; else {

cout<<\除数不能为零\ exit(-1); } }//switch }

///////////////////////////////////////////////////////////////////// /*以下为运算表达式的函数*/ SElemType EvaluateExpression()

{ //算符表达式的优先算法。设OPTR和OPND分别为运算符栈和运算数栈 SqStack OPTR,OPND; char c;

char Data[11];//定义此数组为了存放整数或小数 SElemType a,b,d,e;

InitStack(OPTR);//构造一个运算符栈 InitStack(OPND);//构造一个运算数栈 Push(OPTR,'#');//将#压入栈底 c=getchar(); GetTop(OPTR,e);

while(c!='#'||e!='#')//栈顶不是#号且输入不是#号


《程序设计方法学》实验报告-算术表达式求值(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017-2022年中国餐饮市场运行态势及投资前景趋势预测报告(目录

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: