中缀表达式转化为后缀表达式(栈的应用)

中缀表达式:是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *


中缀表达式转化为后缀表达式规则:

从左至右读取中缀表达式中的元素,当遇到操作数时直接输出,当遇到操作符时,按以下规则处理:

1)如果遇到的是直接压入栈中

2)如果遇到的是“)”,依次将栈中元素弹出,直到遇到“)”为止,但“)”只弹出,并不输出

3)如果遇到的是非括号(即“+”,“-”,“*”,“/”),那么从栈中弹出栈元素直到发现优先级更低的元素或栈为空为止。当从栈弹出元素的工作完成后,再将刚刚读入的操作符压入栈中。


例:

   将中缀表达式a+b*c+(d*e+f)*g转化为后缀表达式,结果为 a b c * + d e * f + g * +

首先,a被读入,直接输出。然后,“+”被读入并压入栈中。接着b读入并输出:


                        


接着“*”读入。栈顶元素比“*”的优先级低,故没有输出,“*”进栈。接着,c被读入并输出:


                        


后面的一个符号是“+”号。此时,栈顶元素“*”的优先级比“+”高,故需将“*”从栈中弹出并输出;弹出后栈顶元素为“+”号,优先级并不比刚读入的“+”号优先级低,故依然将栈顶元素“+”弹出。然后将刚刚遇到的“+”压入栈中


                     


下一个被读入的符号是“(”,由于有最高的优先级,因此直接压入栈中。然后,d读入并输出。


                      


紧接着,又读入一个“*”。除非遇到“)”,否则“(”绝不会从栈中弹出,因此,没有输出。下一个读入e,直接输出。


                    


再往后读入符号“+”。依据规则3,我们将“*”弹出并输出,然后将“+”压入栈中。然后,读入f并输出


                      


现在,读到一个“)”,依据规则2,将栈元素依次弹出并输出,直到“)”弹出。


                     


接着又读入一个“*”,压入栈中。然后读入g并输出


                         

现在输入为空,因此我们将栈中的符合全部弹出并输出,直到栈为空


                       

练习:

http://acm.nyist.net/JudgeOnline/problem.php?pid=467

http://acm.nyist.net/JudgeOnline/problem.php?pid=267

原文地址:https://www.cnblogs.com/riskyer/p/3278489.html