算法基础之表达式求值
-
中序表达式求值 用栈
-
将字符和数字分别用栈存储 由下往上计算
-
左子树算完再算右子树 判断方法:当前符号优先级<=前一个符号优先级 则左右子树已遍历完
-
#include<iostream> #include<cstring> #include<stack> #include<algorithm> #include<unordered_map> using namespace std; //分别存储数字和符号 stack<int> num; stack<int> op; void eval(){ //先取b 再取a auto b = num.top(); num.pop(); auto a = num.top(); num.pop(); auto c = op.top(); op.pop(); int x; if(c=='+') x=a+b; else if(c=='-') x=a-b; else if(c=='*') x=a*b; else x=a/b; //算完放回栈 作为一颗子树的值 num.push(x); } int main(){ //用哈希表存储 字符及其优先级 unordered_map<char,int> pr{{'+',1},{'-',1},{'*',2},{'/',2}}; string str; cin>>str; for(int i=0;i<str.size();i++){ auto c =str[i]; //数字 if(isdigit(c)){ int x=0,j=i; //可能是连续的数字 一个大数 while(j<str.size()&&isdigit(str[j])){ x = x*10 + str[j++] - '0'; } //因为退出这个if以后 j++已经执行 i++又做自增 所以会多1 要减去 i = j-1; num.push(x); } //左括号放进栈 else if(c=='(') op.push(c); //有括号执行之前存入的符号 else if(c==')'){ while(op.top() != '(') eval(); //删掉左括号 op.pop(); } //符号 else { //如果栈顶运算符优先级较高,先操作栈顶元素再入栈 while(op.size()&&pr[op.top()]>=pr[c]) eval(); //如果栈顶运算符优先级较低,直接入栈 op.push(c); } } //没有操作完的继续操作(最外层没有括号的没操作) while(op.size()) eval(); //栈顶元素为答案 cout<<num.top()<<endl; return 0; }