题目链接:传送门(点我)
#include<bits/stdc++.h>
using namespace std;
stack<char>s;
int t[5000],cnt;
string in,out="";
int pri[10]={-1,0,1,1,2,2,3};//左括号加减乘除 优先级
char op[10]={'#','(','+','-','*','/','^'};
int find(char o)
{
for(int i=2;i<=6;i++)
if(o==op[i])return 1;
return 0;
}
int pr(char o)//传入操作符,返回优先级
{
for(int i=0;i<7;i++)
if(op[i]==o)return pri[i];
}
int calc(int x,int y,char o)//x为栈顶数,y为次顶数 y在算式前,x在后
{
switch(o){
case '+':return x+y;
case '-':return y-x;
case '*':return x*y;
case '/':return y/x;
case '^':return pow(y,x);
}
}
int main()
{
cin>>in;
s.push('#');
for(int i=0;i<in.length();i++)
{
if(in[i]>='0'&&in[i]<='9')out+=in[i];
else{//处理符号
if(in[i]=='(')s.push(in[i]);
else{
if(in[i]==')'){//弹出直到左括号位置
while(s.top()!='('){
out+=s.top();s.pop();
}
s.pop();//弹出左括号
continue;
}
//对符号栈进行操作
if(pr(in[i])>pr(s.top()))s.push(in[i]);
else if(pr(in[i])<=pr(s.top())){
while(pr(in[i])<=pr(s.top())){out+=s.top();s.pop();}
s.push((in[i]));
}
}
}
}
while(s.top()!='#'){out+=s.top();s.pop();}
for(int i=0;i<out.length();i++)cout<<out[i]<<" ";
cout<<endl;
for(int i=0;i<out.length();i++)
{
if(out[i]>='0'&&out[i]<='9')t[cnt++]=out[i]-'0';
if(find(out[i])){
int m=t[--cnt];
int n=t[--cnt];
int now=calc(m,n,out[i]);
t[cnt++]=now;
//cout<<" m:"<<m<<" n:"<<n<<" now:"<<now<<endl;
for(int j=0;j<cnt;j++)cout<<t[j]<<" ";
for(int j=i+1;j<out.length();j++)cout<<out[j]<<" ";
cout<<endl;
}
}
return 0;
}