3-06. 表达式转换
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式说明:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式说明:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + |
2 | ((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / |
3 | 1314+25.5*12 | 1314 25.5 12 * + |
4 | -2*(+3) | -2 3 * |
5 | 123 | 123 |
遍历中缀表达式的每个节点,如果:
1、 该节点为
操作数:
直接拷贝进入后缀表达式
2、 该节点是运算符,分以下几种情况:
A、 为“(”
运算符:
压入临时堆栈中
B、 为“)”
运算符:
C、 为其他运算符,有以下步骤进行:
比较该运算符与临时栈栈顶指针的运算符的优先级,如果临时栈栈顶指针的优先级高于该运算符的优先级,弹出并添加到后缀表达式中,反复执行前面的比较工作,直到遇到一个栈顶指针的优先级低于该运算符的优先级,停止弹出添加并把该运算符压入栈中。
此时的比较过程如果出现栈顶的
指针为‘(’,则停止循环并把该运算符压入栈中,注意:‘(’不要弹出来。
遍历完中缀表达式之后,检查临时栈,如果还有
运算符,则全部弹出,并添加到后缀表达式中。
//然后我按度娘的想法写了相应的程序,果然度娘没骗我。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
stack<char> sta;
int main()
{
string s;
string anwser;
cin>>s;
int i;
bool number = false;
bool firstFlag = true;
string snum = "";
for(i = 0; i < s.length(); ++i)
{
if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
{
number = true;
snum += s[i];
}
else if(number == true)
{
number = false;
if(firstFlag)
firstFlag = false;
else
anwser += " ";
if(snum[0] == '+')
snum.erase(snum.begin());
anwser += snum;
snum = "";
}
if(s[i] == '+' || s[i] == '-')
{
if(i == 0 ||
s[i-1] == '+' || s[i-1] == '-' ||
s[i-1] == '*' || s[i-1] == '/' ||
s[i-1] == '(' )
snum += s[i];
else
{
while(sta.size() && sta.top() != '(')
{
int t = sta.top();
if(firstFlag)
firstFlag = false;
else
anwser += " ";
anwser += t;
sta.pop();
}
sta.push(s[i]);
}
}
else if(s[i] == '*' || s[i] == '/')
{
while(sta.size() && sta.top() != '(')
{
int t = sta.top();
if(t == '-' || t == '+')
break;
if(firstFlag)
firstFlag = false;
else
anwser += " ";
anwser += sta.top();
sta.pop();
}
sta.push(s[i]);
}
else if(s[i] == ')')
{
while(sta.size() && sta.top() != '(')
{
if(firstFlag)
firstFlag = false;
else
anwser += " ";
anwser += sta.top();
sta.pop();
}
if(sta.size())
sta.pop();
}
else if(s[i] == '(')
sta.push(s[i]);
}
if(snum != "")
{
if(firstFlag)
firstFlag = false;
else
anwser += " ";
anwser += snum;
}
while(sta.size())
{
if(firstFlag)
firstFlag = false;
else
anwser += " ";
anwser += sta.top();
sta.pop();
}
cout<<anwser<<endl;
return 0;
}