方法一:【严蔚敏版】
OperandType EvaluateExpression(){
//算术表达式求值的算符优先算法。设OPTR为运算符栈,OPND为操作数栈
//OP为运算符集合
InitStack(OPTR); Push(OPTR,'#'); //“#”为运算符栈的栈低元素
InitStack(OPND); c=getchar(); //输入表达式,表达式起始符为“#”
while(c!= '#' || GetTop(OPTR)!='#'){
if(!In(c,OP)){ Push(OPND,c);c=getchar();} //当前字符c不是运算符则进操作数栈
//In(c,OP) 判断字符c是否是运算符
else
switch(Precede(GetTop(OPTR),c)){
//Precede是判断运算符栈的栈顶运算符与读入的运算符直接的优先级关系的函数
case'<': //栈顶元素优先级低
Push(OPTR,c);c=getchar(); //将高优先级的运算符压入运算符栈
break;
case'=': //当前运算符是‘)’,且运算符栈顶元素为‘(’
Pop(OPTR,x); c=getchar(); //脱括号并接收下一字符
break;
case'>': // 栈顶元素优先级高
Pop(OPTR,theta); //将运算符栈栈顶元素输出,并赋值给theta
Pop(OPND,b); Pop(OPND,a); //将操作数栈前两个元素输出
Push(OPND,Operate(a,theta,b)); //将运算结果压回操作数栈
//由于栈的后进先出,所以后输出的操作数在运算符前
//Operate为进行二元运算的函数
break;
}//switch
}//while
return GetTop(OPND);
}
方法二:【王道版】
后缀表达式运算(操作数均为个位数)_yyy_zxc的博客-CSDN博客