版权声明:请注明转载地址 https://blog.csdn.net/OCEANtroye https://blog.csdn.net/OCEANtroye/article/details/83315355
中缀表达式转后缀表达式算法
使用栈进行辅助
对于符号±/(),定义为/优先级为2,’(’(左括号)优先级为3,右括号’)'优先级最低为0
对于一个表达式
如果当前字符为数字: 输出到输出队列中; 否则当前字符是运算符号或者括号时候: while 当前优先级大于栈顶优先级并且栈不空: 栈顶元素出栈加入到输出队列中; 将元素压入栈内; while 当前栈非空: 出栈返回栈顶元素;
对于左右括号问题
把左括号定义为 压入前是最高的优先级 压入后是最低优先级
这样一旦遇到左括号一定能被压入,并且压入后等级是最低的
定义右括号为第二低低的优先级 这样它就可以 一直pop栈元素
然后等遇到左括号 (左括号这个时候是最低的优先级)的时候
pop左括号
源码
#include <iostream>
#include <stack>
#include <cctype>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> ss;
ss['+'] = 1;
ss['-'] = 1;
ss['*'] = 2;
ss['/'] = 2;
stack<char> s;
string express;
while (cin >> express)
{
for (int i = 0; i < express.length(); i++)
{
if (isalpha(express[i]))
{
cout << express[i] << " ";
}
else if (express[i] == '(')
{
s.push(express[i]);
}
else if (express[i] == ')')
{
while (s.top() != '(')
{
cout << s.top() << " ";
s.pop();
}
s.pop();
}
//*/优先级高因此栈的栈顶是优先级高的
else
{
//cout << express[i];
// 当前栈顶的元素优先级大于当前零时字符
while (!s.empty() && ss[s.top()] >= ss[express[i]])
{
cout << s.top() << " ";
s.pop();
}
s.push(express[i]);
}
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
system("pause");
return 0;
}