后缀表达式严格按照从左到右进行计算的模式,符合计算机运行方式,而中缀表达式需要计算机遇到符号后向后扫描一位,若为括号或优先级更高的操作符还需要向后继续扫描。
设我们欲将中缀表达式 a+b*c+(d*e+f)*g转换成后缀表达式,正确的答案为:abc*+de*f+g*+
当我们读入操作数的时候,立即将其放入到输出中,操作符不立即输出,将其放入栈中。如果我们见到一个右括号,那么我们就从栈中弹出栈元素直至遇到一个左括号,左右括号都只被弹出而不输出。
如果我们见到任何其他的符号+ * (,那么我们从栈中弹出栈元素,直至发现优先级更低的元素为止,但是有一个例外: 除非是在处理一个)的时候,否则我们绝不从栈中移除(,+的优先级最低,(的优先级最高,当从栈中弹出元素的工作完成后,我们再将其操作符压入栈中。
最后,如果我们读到输入的末尾,我们将栈元素弹出直至该栈变成空栈,将符号写到输出中。
规则很多,还是用实例比较容易说清楚整个过程。以上面的转换为例,输入为a + b * c + (d * e + f)*g,处理过程如下:
1)首先读到a,直接输出。
2)读到“+”,将其放入到栈中。
3)读到b,直接输出。
此时栈和输出的情况如下:
4)读到“*”,因为栈顶元素”+”优先级比” * ” 低,所以将” * “直接压入栈中。
5)读到c,直接输出。
此时栈和输出情况如下:
6)读到” + “,因为栈顶元素” * “的优先级比它高,所以弹出” * “并输出, 同理,栈中下一个元素” + “优先级与读到的操作符” + “一样,所以也要弹出并输出。然后再将读到的” + “压入栈中。
此时栈和输出情况如下:
7)下一个读到的为”(“,它优先级最高,所以直接放入到栈中。
8)读到d,将其直接输出。
此时栈和输出情况如下:
9)读到” * “,由于只有遇到” ) “的时候左括号”(“才会弹出,所以” * “直接压入栈中。
10)读到e,直接输出。
此时栈和输出情况如下:
11)读到” + “,弹出” * “并输出,然后将”+”压入栈中。
12)读到f,直接输出。
此时栈和输出情况:
13)接下来读到“)”,则直接将栈中元素弹出并输出直到遇到”(“为止。这里右括号前只有一个操作符”+”被弹出并输出。
14)读到” * “,压入栈中。读到g,直接输出。
15)此时输入数据已经读到末尾,栈中还有两个操作符“*”和” + “,直接弹出并输出。
至此整个转换过程完成。程序实现代码后续再补充了。
1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )
2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+
3)去掉括号,得到abc*+de*f+g*+