所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。
如:中缀表达式 3*(5–2)+7 对应的后缀表达式为:352-*7+ 。
请将给出的中缀表达式转化为后缀表达式并输出。
输入格式:
输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。
输出格式:
输出一行,为后缀表达式,式中无空格。
输入样例:
2+48+(88+1)/3
输出样例:
248*+88*1+3/+
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;cin>>s;
stack<char>ch;
map<char,int>mp;
mp['+']=mp['-']=1;
mp['*']=mp['/']=2;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
cout<<s[i];
}else if(s[i]!='('&&s[i]!=')'){
if(ch.empty()||mp[s[i]]>mp[ch.top()]&&ch.top()=='('){
ch.push(s[i]);
}else{
while(!ch.empty()&&mp[s[i]]<=mp[ch.top()]){
cout<<ch.top();
ch.pop();
}
ch.push(s[i]);
}
}else if(s[i]=='('){
ch.push(s[i]);
}else if(s[i]==')'){
while(ch.top()!='('){
cout<<ch.top();
ch.pop();
}
ch.pop();
}
}
while(!ch.empty()){
cout<<ch.top();
ch.pop();
}
return 0;
}