//************ 课本53页,用栈来实现的简单的四则运算表达式. '#'是表达式结束符, 注意在表达式输入完毕后需再输入一个'#'表示结束. eg:4+2*3-10/5# **********// #include<stdio.h> #include <iostream> #include <string> #include <cstring> #include <stack> using namespace std; stack<int> opnd; //操作数栈 stack<char> optr; //算符栈 char expression[100]; //用于盛放表达式 char Compare(char a, char b); //返回两算符a和b的优先级关系 int Calculate(int a, int b, char op); //返回计算结果 int EvaluateExpression(); //求值过程 bool IsOptr(char c); //是否是算符 int main(){ optr.push('#'); //在表达式最左边增设一个'#'构成整个表达式的一对'#' while(scanf("%s", expression) != EOF) cout<<EvaluateExpression()<<endl; return 0; } char Compare(char a, char b){ //返回两算符a和b的优先级关系 if('#' == a) if('#' == b) return '='; else return '<'; if('+'==a || '-'==a) if('*'==b || '/'==b || '('==b) return '<'; else return '>'; if('*'==a || '/'==a) if('(' == b) return '<'; else return '>'; if('(' == a) if(')' == b) return '='; else return '<'; } int Calculate(int a, int b, char op) //返回计算结果 { switch(op) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } } bool IsOptr(char c){ static string oprator("+-*/()#"); if(oprator.find(c) == string::npos) return false; //不是算符 return true; //是算符 } int EvaluateExpression(){ //求值过程 int i=0, num=0; while(expression[i]!='#' || optr.top()!='#'){ if(!IsOptr(expression[i])){ //不是算符,则是操作数 num = 0; while(!IsOptr(expression[i])) { //求得此操作数 num *= 10; num += expression[i]-'0'; ++i; } opnd.push(num); } else{ switch(Compare(optr.top(), expression[i])){ case '<': optr.push(expression[i]); ++i; break; case '=': optr.pop(); ++i; break; case '>': int a = opnd.top(); opnd.pop(); int b = opnd.top(); opnd.pop(); opnd.push(Calculate(b, a, optr.top())); //注意这里a和b的顺序 optr.pop(); break; } } } optr.push('#'); //在表达式最左边增设一个'#'构成整个表达式的一对'#' int res=opnd.top(); opnd.pop(); return res; }