算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、/
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include<bits/stdc++.h>
using namespace std;
void deal(string str){
stack<char> stk;
map<char,int> m;
m['+']=m['-']=1;
m['*']=m['/']=2;
m['(']=m[')']=3;
int index=0,flag=1;
while(index<str.size()){
if((index<1||str[index-1]=='(')&&(str[index]=='+'||str[index]=='-')||isdigit(str[index])){
if(flag)flag=0;
else printf(" ");
if(str[index]!='+')printf("%c",str[index]);
while(str[index+1]=='.'||isdigit(str[index+1])){
printf("%c",str[++index]);
}
index++;
}else{
if(str[index]=='(') stk.push(str[index]);
else if(str[index]==')'){
while(!stk.empty()&&stk.top()!='('){
printf(" %c",stk.top());
stk.pop();
}
stk.pop();
}else{
while(!stk.empty()&&stk.top()!='('&&m[stk.top()]>=m[str[index]]){
printf(" %c",stk.top());
stk.pop();
}
stk.push(str[index]);
}
index++;
}
}
while(!stk.empty()){
printf(" %c",stk.top());
stk.pop();
}
}
int main(){
string str;
cin>>str;
deal(str);
return 0;
}