7-1 表达式转换
分数 25
全屏浏览
切换布局
作者 DS课程组
单位 浙江大学
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、/
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include<bits/stdc++.h>
using namespace std;
stack<char> b;
map<char,int> mp;
int main()
{
mp['+']=mp['-']=1;
mp['*']=mp['/']=2;
mp['(']=0;
mp[')']=3;
string s,res;
cin>>s;
int i=0,flag=1;
while(i<s.size())
{
//这里的数包括小数和负数和多位数
//如果是开头或括号里的第一个+-号,就是正负号,直接放到res结果字符串中
if((i==0||s[i-1]=='(')&&(s[i]=='+'||s[i]=='-')||isdigit(s[i]))
{
if(flag) flag=0;
else cout<<' ';
if(s[i]!='+') cout<<s[i];
while(s[i+1]=='.'||isdigit(s[i+1]))
{
i++;
cout<<s[i];
}
i++;
}
else
{
if(b.empty()) b.push(s[i]);
else
{
char k=b.top();
//当前符号优先级比栈顶高或者当前符号为'(',就直接入栈
if(mp[k]<mp[s[i]]||s[i]=='(') b.push(s[i]);
else //当前符号优先级比栈顶低,先把栈里计算出来(清空栈)
//然后进行后续计算
{
//清空栈
while(b.size())
{
char x=b.top();
if(x!='('&&x!=')') cout<<' '<<x;
b.pop();
}
//后续计算操作
b.push(s[i]);
}
}
i++;
}
}
while(b.size())
{
char x=b.top();
if(x!='('&&x!=')') cout<<' '<<x;
b.pop();
}
return 0;
}