5 后缀表达式 (100分)
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。
如:中缀表达式 3*(5–2)+7 对应的后缀表达式为:352-*7+ 。
请将给出的中缀表达式转化为后缀表达式并输出。
输入格式:
输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。
输出格式:
输出一行,为后缀表达式,式中无空格。
输入样例:
2+48+(88+1)/3
输出样例:
248*+88*1+3/+
逻辑易错点标在代码上了
#include<algorithm>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
string c;
stack<char> c1;
int trans(char x)
{
if(x=='*'||x=='/') return 3;
else if(x=='+'||x=='-') return 2;
else if(x=='^') return 4;
else return 1;//用这种函数的方式就能轻松判断出量级
}
int main()
{
int i;
cin>>c;
for(i=0;i<c.size();i++)
{
if(c[i]<='9'&&c[i]>='0') cout<<c[i];
else if(c[i]=='(') c1.push(c[i]);
else if(c[i]=='*'||c[i]=='/'||c[i]=='+'||c[i]=='-')//只要是运算符,都是输出级数更小或相等的
{
while(c1.size()!=0&&trans(c1.top())>=trans(c[i]))//一开始逻辑错误
{
cout<<c1.top();
c1.pop();
}
c1.push(c[i]);//注意,在出栈后这个新数还要入栈
}
else if(c[i]==')')
{
while(c1.top()!='(')
{
cout<<c1.top();
c1.pop();
}
c1.pop();
}
}
while(!c1.empty())//用empty和size都可以
{
cout<<c1.top();
c1.pop();
}
return 0;
}