OperandType EvaluteExpression() { CreatStack(OPTR); //创建栈OPTR Push('#',OPTR); CreatStack(OPND); //创建栈OPND c=getchar(); while(c!='#'‖StackTop(OPTR)!='#') //匹配完成 { if (!In(c,OP)) {Push(c,OPND);c=getchar();} else switch(Precede(StackTop(OPTR),c)) { case'<':Push(c、OPTR);c=getchar(); break; case‘=’ :Pop(x,OPTR); c=getchar(); break; case'>':Pop(theta,OPTR); Pop(b,OPND); Pop(a,OPND); Push(operate(a,theta,b),OPND); break; } } return StackTop(OPND); }
时间: 2023-06-27 08:05:00 浏览: 70
实验七 栈及队列的应用.docx
这是一个算术表达式求值的函数,使用了两个栈OPTR和OPND。
首先,程序从标准输入中读入字符c,如果c是操作数,则将其压入OPND栈;如果c是运算符,则需要进行比较运算符优先级的操作。
使用Precede函数来比较栈顶运算符的优先级和当前读入运算符的优先级。如果栈顶优先级低于读入运算符的优先级,则将读入运算符压入OPTR栈;如果栈顶优先级等于读入运算符的优先级,则将栈顶元素弹出,丢弃读入运算符;如果栈顶优先级高于读入运算符的优先级,则需要进行运算,弹出OPTR和OPND栈的栈顶元素,计算结果并将结果压入OPND栈。
最后,当读入到'#'符号,且OPTR栈中只剩下'#'符号时,说明表达式已经匹配完成,OPND栈中剩下的元素即为表达式的计算结果,将其返回。
需要注意的是,这段代码并没有对输入的表达式进行错误处理,如果输入的表达式不符合规范,程序可能会出现错误。
阅读全文