中序表达式向后序表达式的转换(c++实现)
一.中序表达式和后序表达式
中序表达式:就是我们学习中经常看到的表达式:6*(5+(2+3)*8+3)=288;
后序表达式:也叫逆波兰表达式,这是计算机处理表达式的方式。
二.实现原理
1.当读取的是操作数时,直接放置到输出;
2.当读取的是操作符时,不直接放置到输出,必须先存放在某个地方(实际上为栈),然后进行优先级的比较:
如果该操作符的优先级比栈顶的要高,那么就入栈;
如果该操作符的优先级没有栈顶的高,那么栈顶的操作符就出栈,再接着比较当前栈顶操作符的优先级当 前操作符的优先级......
3.如果读取到的操作符为“(”,那么直接入栈;
4.如果读取到的操作符为“)”,那么从栈弹出操作符,并写入输出,直到遇到“(”,“(”和“)”不写入到输出;
5.当输入为空时,将栈中的全部操作符弹出并写入到输出中。
三.C++实现
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int priority(char ch)
{
if (ch == '*' || ch == '/')
return 1;
if (ch == '+' || ch == '-')
return 0;
if (ch == '(')
return -1;
}
int main()
{
string input = "1+2*3+(4*5+6)*7"; //待处理中序表达式
string output;
stack<char> st;
for (const auto &p : input)
{
if (p == '+' || p == '-' || p == '*' || p == '/' || p == '(')
{
if (p == '(')
st.push(p);
else
{
while ((!st.empty())&&(priority(p) <= priority(st.top())))
{
output += st.top();
st.pop();
}
st.push(p);
}
}
else if (p == ')')
{
while (st.top()!= '(')
{
output += st.top();
st.pop();
}
st.pop();
}
else //如果是操作数,直接输入到输出
output += p;
}
while (!st.empty())
{
output += st.top();
st.pop();
}
cout << output << endl;
return 1;
}
四.参考
《数据结构与算法分析-C语言描述》P52-P56;