0001 float evaluate ( char* S, char*& RPN ) { //对(已剔除白空格的)表达式S求值,并转换为逆波兰式RPN 0002 Stack<float> opnd; Stack<char> optr; //运算数栈、运算符栈 0003 optr.push ( '\0' ); //尾哨兵'\0'也作为头哨兵首先入栈 0004 while ( !optr.empty() ) { //在运算符栈非空之前,逐个处理表达式中各字符 0005 if ( isdigit ( *S ) ) { //若当前字符为操作数,则 0006 readNumber ( S, opnd ); append ( RPN, opnd.top() ); //读入操作数,并将其接至RPN末尾 0007 } else //若当前字符为运算符,则 0008 switch ( orderBetween ( optr.top(), *S ) ) { //视其与栈顶运算符之间优先级高低分别处理 0009 case '<': //栈顶运算符优先级更低时 0010 optr.push ( *S ); S++; //计算推迟,当前运算符进栈 0011 break; 0012 case '=': //优先级相等(当前运算符为右括号或者尾部哨兵'\0')时 0013 optr.pop(); S++; //脱括号并接收下一个字符 0014 break; 0015 case '>': { //栈顶运算符优先级更高时,可实施相应的计算,并将结果重新入栈 0016 char op = optr.pop(); append ( RPN, op ); //栈顶运算符出栈并续接至RPN末尾 0017 if ( '!' == op ) { //若属于一元运算符 0018 float pOpnd = opnd.pop(); //只需取出一个操作数,并 0019 opnd.push ( calcu ( op, pOpnd ) ); //实施一元计算,结果入栈 0020 } else { //对于其它(二元)运算符 0021 float pOpnd2 = opnd.pop(), pOpnd1 = opnd.pop(); //取出后、前操作数 0022 opnd.push ( calcu ( pOpnd1, op, pOpnd2 ) ); //实施二元计算,结果入栈 0023 } 0024 break; 0025 } 0026 default : exit ( -1 ); //逢语法错误,不做处理直接退出 0027 }//switch 0028 }//while 0029 return opnd.pop(); //弹出并返回最后的计算结果 0030 }