表达式求值
//算数表达式求值的算运算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
char EvaluateExpression(){
InitStack(OPND); //初始化操作数栈
InitStack(OPTR); //初始化运算符栈
Push(OPTR,'#'); //把表达式起始符 # 压入运算符栈
cin>>ch;
while(ch!='#'||GetTop(OPTR)!='#'){ //表达式没有扫描完毕或者运算符栈不为 #
if(!In(ch)){ //ch不是运算符则进入操作数栈
Push(OPND,ch); //函数In()是判断读入字符是否为运算符的
cin>>ch;
}else{
//函数Preced()判定运算符的栈顶元素与读入的运算符之间优先关系的函数
switch(Preced(GetTop(OPTR),ch)){ //比较运算符的栈顶元素和ch的优先级
case '<':
Push(OPTR,ch); //当前字符ch压入运算符栈 读入下一字符ch
cin>>ch;
break;
case '>':
Pop(OPTR,theta); //弹出运算符栈 栈顶的运算符
Pop(OPND,b); //弹出操作数栈 顶的两个元素
Pop(OPND,a);
//函数Operate是二元运算的函数
Push(OPND,Operate(a,theata,b)); //将结果压入操作数栈
break;
case '=': //运算符栈的栈顶元素是"("且ch是")"
Pop(OPTR,x); //弹出运算符栈栈顶的"(",读入下一个字符ch
cin>>ch;
break;
}
}
}
return GetTop(OPND); //操作数栈顶元素即为表达式求值结果
}