算法:
1. 设置一个运算符栈(初始时可以将栈顶运算符置为“#”);
2. 按顺序扫描中缀表达式,当输入为操作数时就将其输出到后缀表达式中;
3. 当输入为运算符时,则比较输入运算符和栈顶运算符的优先级。若输入运算符的优先级高于栈顶运算符的优先级,则将输入运算符入栈;否则,栈顶运算符的优先级高于或等于输入运算符的优先级,弹出栈顶运算符到后缀表达式,然后重新比较输入运算符和更新后的栈顶运算符的优先级,若栈为空则输入运算符入栈;
4. 当输入运算符为“(”时,直接将其入栈;
5. 当输入运算符为“)”时,将栈顶运算符出栈至后缀表达式,直到栈顶为“(”,然后将“(”和“)”一同抛弃;
6. 中缀表达式扫描完毕后,将运算符栈依次出栈到后缀表达式,直到栈空(或栈顶为“#”)时停止。
简单题目
Description
输入一个中缀算术表达式S,S中的操作数为0到9,只含+,-和*,/运算,也可能含有括号(),运算符的计算顺序和实际四则运算的计算顺序相同. 请输出与S等价的后缀表达式,注意输出结果不要含有多余的括号或空格.
Input
输入有多组数据.
每组数据是一个中缀表达式S,S的长度不超过50. 输入的S保证合法,而且不包含多余的空格或制表符.
输入以#号结束.
Output
对于每个中缀表达式,输出转换后的后缀表达式,每个输出占一行.
Sample Input
1 1+2*3 (1-2)/3 #Sample Output
1 123*+ 12-3/
解决代码
#include<iostream>
#include<stack>
#include<string>
using namespace std;
//获取优先级
int getPriority(char a)
{
if(a=='+'||a=='-')
{
return 1;
}
if(a=='*'||a=='/'){
return 2;
}
//左括号
return 0;
}
int main()
{
string input;
stack<char> s;
cin>>input;
while(input != "#")
{
//顺序扫描中缀表达式
for(int i = 0;i < input.size();++i)
{
//如果是数字
if(input.at(i) <= '9' && input.at(i) >= '0')
{
cout<<input.at(i);
}
//如果是左括号
else if(input.at(i) == '(')
{
s.push('(');
}
//如果是右括号
else if(input.at(i) == ')')
{
while(s.top()!='(')
{
cout<<s.top();
s.pop();
}
if(s.top()=='(')
{
s.pop();
}
}
//如果是算术运算符
else
{
if(s.empty())
{
s.push(input.at(i));
}
else
{
while(!s.empty())
{
if(getPriority(input.at(i)) > getPriority(s.top()))
{
s.push(input.at(i));
break;
}
else
{
cout<<s.top();
s.pop();
}
}
if(s.empty())
{
s.push(input.at(i));
}
}
}
}
//最后若栈非空,则全部出栈
while(!s.empty())
{
cout<<s.top();
s.pop();
}
cout<<endl;
cin>>input;
}
return 0;
}