0001 double evaluate ( char* S, char* RPN ) { //对(已剔除白空格的)表达式S求值,并转换为逆波兰式RPN 0002 Stack<double> 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 ( priority ( optr.top(), *S ) ) { //视其与栈顶运算符之间优先级高低分别处理 0009 case '<': //栈顶运算符优先级更低时 0010 optr.push ( *S ); S++; //计算推迟,当前运算符进栈 0011 break; 0012 case '>': { //栈顶运算符优先级更高时,可实施相应的计算,并将结果重新入栈 0013 char op = optr.pop(); append ( RPN, op ); //栈顶运算符出栈并续接至RPN末尾 0014 if ( '!' == op ) //若属于一元运算符 0015 opnd.push ( calcu ( op, opnd.pop() ) ); //则取一个操作数,计算结果入栈 0016 else { //对于其它(二元)运算符 0017 double opnd2 = opnd.pop(), opnd1 = opnd.pop(); //取出后、前操作数 0018 opnd.push ( calcu ( opnd1, op, opnd2 ) ); //实施二元计算,结果入栈 0019 } 0020 break; 0021 } 0022 case '~' : //匹配的运算符(括号或'\0')时 0023 optr.pop(); S++; //脱括号并转至下一字符 0024 break; 0025 default : exit( -1 ); //逢语法错误,不做处理直接退出 0026 }//switch 0027 }//while 0028 return opnd.pop(); //弹出并返回最后的计算结果 0029 }