注:中缀表达式转后缀表达式,要求输入的中缀表达式不能带正负号,括号只有’('和‘)’,且不能有多余的括号,运算符只有加减乘除。若想实现更一般的功能,需要再完善一下代码。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
stack<char> stk; //栈中存储的只有运算符号
bool justic(char a, char b) //判断a的优先级是不是大于等于b,a,b都是运算符
{
if (a == b || b == '(') return true;
else if ((a == '*' || a == '/') && (b == '+' || b == '-')) return true;
else if ((a == '*' || a == '/') && (b == '*' || b == '/')) return true;
else if ((a == '+' || a == '-') &&(b == '+' || b == '-')) return true;
return false;
}
string mid_to_bac(string s)
{
string k="";
string te = "";
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9') { //多位数,粘合成一个数字
te += s[i];
}
else
{
k += te;
k += ' ';
te = "";
if (s[i] == '(') stk.push(s[i]); //若是左括号直接入栈
if (s[i] == ')')
{
while (stk.top() != '(') //如果是右括号,弹出栈顶元素直到遇到左括号
{
k += stk.top();
k += ' ';
stk.pop();
}
//k += stk.top();
stk.pop(); //弹出左括号
}
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
//运算符判断一下优先级,只要栈顶符号的优先级不低于新符号,就不断取出栈顶并
//输出
while (stk.size() > 0 && justic(stk.top(), s[i]))
{
k += stk.top();
k += ' ';
stk.pop();
}
stk.push(s[i]);
}
}
}
while (stk.size() > 0)
{
//依此取出剩余的符号并输出,最终的输出序列就是后缀表达式
k += stk.top();
k += ' ';
stk.pop();
}
return k;
}
int main()
{
string s = "(-31)*(11-21)-(12+5)";
auto k = mid_to_bac(s);
cout << k;
}