【栈的应用】简单计算器:中缀表达式求值(含括号)

    科技2022-08-16  107

    该算法涉及 + - * / ^ ( ) 及负数的中缀表达式求值,可作为模板

    #include<iostream> #include<stack> #include<math.h> #include<string> using namespace std; stack<int> num; stack<char> ops; string s; void cal() { int a=num.top(); num.pop(); int b=num.top(); num.pop(); char c=ops.top(); ops.pop();//这一步别忘了!! int d; if(c=='+') d=a+b; else if(c=='-') d=b-a; else if(c=='*') d=b*a; else if(c=='/') d=b/a;//除号是这个/ else d=pow(b,a); num.push(d); } int main() { cin>>s; s='('+s+')';//这一步别忘 for(int i=0; i<s.size(); i++) { if(s[i]>='0'&&s[i]<='9') { int t=0,j=i; while(s[j]>='0'&&s[j]<='9') { t=t*10+s[j]-'0'; j++; } num.push(t); i=j-1; } else if(s[i]=='(') ops.push(s[i]); else if(s[i]=='+'||s[i]=='-') { if(s[i]=='-'&&i&&!(s[i-1]>='0'&&s[i-1]<='9')&&s[i-1]!=')') //注意判定条件的完整!!! { int t=0,j=i+1; while(s[j]>='0'&&s[j]<='9') { t=t*10+s[j]-'0'; j++; } num.push(-t); i=j-1; } else{ while(ops.top()!='(') cal(); ops.push(s[i]);//别忘了入栈 } } else if(s[i]=='*'||s[i]=='/'){ while(ops.top()=='*'||ops.top()=='/'||ops.top()=='^') cal(); ops.push(s[i]); } else if(s[i]=='^'){ while(ops.top()=='^') cal(); ops.push(s[i]); } else if(s[i]==')'){ while(ops.top()!='(') cal(); ops.pop(); } } cout<<num.top()<<endl; return 0; }
    Processed: 0.016, SQL: 9