算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
注意:
题目给出的中缀表达式涉及括号嵌套、小数运算、负数运算,细节较多
AC Code
#include <bits/stdc++.h>
using namespace std;
stack<char> st;
string prefix, postfix;
int main()
{
cin >> prefix;
for (int i = 0; i < (int)prefix.size(); i++)
{
//是符号,排除小数点
if ((prefix[i] < '0' || prefix[i] > '9') && prefix[i] != '.')
{
//判断'+'和'-'是不是数字的符号
if (i == 0 || prefix[i - 1] == '+' || prefix[i - 1] == '-' || prefix[i - 1] == '*' || prefix[i - 1] == '\\' || prefix[i - 1] == '(')
{
if (prefix[i] == '-')
{
string s(1, prefix[i]);
postfix.insert(postfix.size(), s);
continue;
}
//正号不做处理
else if (prefix[i] == '+')
continue;
}
//对数字和符号用空格分隔
//一般符号前都是数字,除了括号
if (prefix[i] == '(' || prefix[i - 1] == ')')
{
}
else
postfix.insert(postfix.size(), " ");
if (prefix[i] == '+' || prefix[i] == '-')
{
//判断栈顶符号的优先级是不是更高,是的话先运算
if (st.empty() || (st.top() != '*' && st.top() != '/'))
st.push(prefix[i]);
else
{
while (!st.empty())
{
char ch = st.top();
if (ch == '(')
break;
st.pop();
string s(1, ch);
postfix.insert(postfix.size(), s + " ");
}
st.push(prefix[i]);
}
}
else if (prefix[i] == ')')
{
while (st.top() != '(')
{
char ch = st.top();
st.pop();
string s(1, ch);
postfix.insert(postfix.size(), s + " ");
}
st.pop();
}
else
st.push(prefix[i]);
}
else
{
string s(1, prefix[i]);
postfix.insert(postfix.size(), s);
}
}
//如果最后一位是数字那么再加个空格
if (postfix[postfix.size() - 1] >= '0' && postfix[postfix.size() - 1] <= '9')
postfix.insert(postfix.size(), " ");
//把栈内剩余的符号加入后缀表达式
while (!st.empty())
{
char ch = st.top();
st.pop();
string s(1, ch);
postfix.insert(postfix.size(), s + " ");
}
//去掉末尾的空格
if (postfix[postfix.size() - 1] == ' ')
postfix.erase(postfix.size() - 1, 1);
cout << postfix;
return 0;
}