中缀表达式转后缀表达式
本文转自中缀表达式转后缀表达式的计算思路及代码实现 - 简书 (jianshu.com)
同时优化了其程序的输出格式
//中缀表达式转后缀
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int prio(char op)
{ //给运算符优先级排序
int priority;
if (op == '*' || op == '/')
priority = 2;
if (op == '+' || op == '-')
priority = 1;
if (op == '(')
priority = 0;
return priority;
}
bool Trans(string &str, string &str1)
{
stack<char> s; //定义一个char类型的栈s
int i;
for (i = 0; i < str.size(); i++)
{
if (str[i] >= '0' && str[i] <= '9')
{ //如果是数字,直接入栈
str1 += str[i];
}
else
{ //否则不是数字
if (str1[str1.length() - 1] != ' ')
str1 += ' ';
if (s.empty()) //栈空则入站
{
s.push(str[i]);
}
else if (str[i] == '(') //左括号入栈
{
s.push(str[i]);
}
else if (str[i] == ')')
{ //如果是右括号,只要栈顶不是左括号,就弹出并输出
while (s.top() != '(')
{
str1 += s.top();
str1 += ' ';
s.pop();
}
s.pop(); //弹出左括号,但不输出
}
else
{
while (prio(str[i]) <= prio(s.top()))
{ //栈顶优先级大于等于当前运算符,则输出
str1 += s.top();
str1 += ' ';
s.pop();
if (s.empty()) //栈为空,停止
break;
}
s.push(str[i]); //把当前运算符入栈
}
}
}
while (!s.empty())
{ //最后,如果栈不空,则弹出所有元素并输出
str1 += ' ';
str1 += s.top();
s.pop();
}
return true;
}
int main()
{ //主程序
string infix;
string postfix;
cout << "请输入中缀表达式:" << infix << endl;
cin >> infix;
Trans(infix, postfix);
cout << "后缀表达式为:" << postfix << endl;
return 1;
}
tips:
关于程序中str1+=str[i]的操作,其作用是在字符串后接上一个字符
//比如原来
string str = "123";
str += '&';
//那现在str就变成"123&"
这是我见过的比较简洁且不使用单独栈来存储数字的中缀转后缀代码