引用某本蓝书
解决这道题,首先其实就是两步,1.把中缀转后缀 2.把后缀计算并输出
1. 中缀表达式转后缀表达式
建立一个栈来存储运算符
- 左括号:进栈
- 数字:输出
- 右括号:取栈顶直到左括号,把左括号出栈
- 运算符:保证优先级的前提下,插入到合适的地方
2.计算后缀表达式
建立一个栈存数
- 遇到数:进栈
- 遇到运算符:取栈顶两个数进行计算
大概就是这样了,代码如下:
#include<bits/stdc++.h> using namespace std; inline int bj(char op){//^ > */ > +- > ( if(op=='(')return 0; if(op=='+'||op=='-')return 1; if(op=='*'||op=='/')return 2; if(op=='^')return 3; return -1; 防止特殊情况 } inline int calc(char op,int a,int b){//运算 switch(op){//注意先后顺序 case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; case '^':return pow(a,b); } } string st1; inline string change(string s){//转成后缀表达式 int top=0; string res="";//string会更方便 for(int i=0;i<s.size();i++){ if(isdigit(s[i])) res+=s[i]; else if(s[i]=='(')st1[++top]=s[i];//左括号 else if(s[i]==')'){//右括号 while(top>0&&st1[top]!='(') res+=st1[top--]; top--; } else { while(top>0&&bj(st1[top])>=bj(s[i])) res+=st1[top--]; st1[++top]=s[i]; } } while(top)res+=st1[top--]; return res; } int st[105],top; inline void get_ans(string s){ for(int i=0;i<s.size();i++) cout<<s[i]<<" "; cout<<endl; for(int i=0;i<s.size();i++){ if(isdigit(s[i])) st[++top]=s[i]-'0'; else{ int a=st[top--],b=st[top--]; st[++top]=calc(s[i],b,a); for(int j=1;j<=top;j++)//先输出处理过的 printf("%d ",st[j]); for(int j=i+1;j<s.size();j++)//输出未处理的 printf("%c ",s[j]); puts(""); } } } int main(){ string s; cin>>s; s=change(s); get_ans(s); return 0; }