#include<bits/stdc++.h>
using namespace std;
stack <char> s;
int level(char a)
{
if(a=='('||a==')')//()这两个等级最低,特殊处理
return 0;
if(a=='+'||a=='-')
return 1;
if(a=='*'||a=='/')
return 2;
}
int main()
{
char a[1001];
int i;
cin>>a;
int len = strlen(a);
for( i=0;i<len;i++)
{
if(a[i]<='9'&&a[i]>='0')
cout<<a[i];//遇到数字直接输出
else if(a[i]=='(')
{//遇到(直接入栈
s.push(a[i]);
}
else if(a[i]==')')//遇到)将栈里面的全部输出直到遇到(
{
while(s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.pop();
}
else if(a[i]=='*'||a[i]=='/'||a[i]=='+'||a[i]=='-')
{
if(s.empty())//空了直接入栈,防止段错误
s.push(a[i]);
else if(level(s.top())<level(a[i]))
s.push(a[i]);//等级高的直接入栈
else
{
while(!s.empty()&&level(a[i])<=level(s.top()))//等级低 把栈里面的取出 直到栈顶符号等级小于新输入的符号
{
cout<<s.top();
s.pop();//栈顶的符号弹出
}
s.push(a[i]);//入栈
}
}
}
if(i==len)//到最后把剩余符号全部弹出
while(!s.empty())
{
cout<<s.top();
s.pop();
}
}
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。
如:中缀表达式 3*(5–2)+7 对应的后缀表达式为:352-*7+ 。
请将给出的中缀表达式转化为后缀表达式并输出。
输入格式:
输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。
输出格式:
输出一行,为后缀表达式,式中无空格。
输入样例:
2+4*8+(8*8+1)/3
输出样例:
248*+88*1+3/+
遇到数字直接输出,遇到符号判断优先级,遇到"(" ")"特殊处理.