问题描述:
请编写程序将一个中缀表达式转换为后缀表达式。
输入
仅一行,是一个中缀表达式。输入的符号中只有这些基本符号“0123456789+-*/()”,并且不会出现形如2*-3的格式,所有数字都是个位数,“/”表示整除运算。
输出
仅一行,是转换后的后缀表达式。数字之间、运算符之间、数字和运算符之间都用一个空格隔开(参见样例)。
样例
.in
8-(3+2*6)/5+4
.out
8 3 2 6 * + 5 / - 4 +
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int prior(char op)
{
if(op=='+'||op=='-')
return 1;
if(op=='*'||op=='/')
return 2;
return 0;
}
string middletolast(string middle)
{
stack<char> op;
string ans;
for(int i=0; i<middle.size(); i++)
{
char c=middle[i];
if(c>='0'&&c<='9')
{
ans.append(1,c);
}
else
{
if(c=='(')
op.push('(');
else
{
if(c==')')
{
while(op.top()!='(')
{
ans.append(1,op.top());
op.pop();
}
op.pop();
}
else
{
if(op.empty())
{
op.push(c);
}
else
{
if(prior(c)>prior(op.top()))
op.push(c);
else
{
while(!op.empty()&&prior(c)<=prior(op.top()))
{
ans.append(1,op.top());
op.pop();
}
op.push(c);
}
}
}
}
}
}
while(!op.empty())
{
ans.append(1,op.top());
op.pop();
}
return ans;
}
int main()
{
string mdata,res;
cin>>mdata;
res=middletolast(mdata);
for(int i=0; i<res.size(); i++)
{
if(i==0)
cout<<res[i];
else
cout<<' '<<res[i];
}
cout<<endl;
return 0;
}