引用某本蓝书
解决这道题,首先其实就是两步,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;
}