中缀表达式 转 后缀表达式.
概述:中缀表达式就是我们常常在数学上用的运算符在中间,运算数在旁边的表达式:如 : 9+(3-1)*3+10/2
转换的过程也不难,仅仅需要一个空栈(用于存储临时操作符)就能解决了.
原理:有两个特例,1是"(",即左括号;2是栈顶运算符的优先级高于当前运算符.具体地说:
顺序扫描中缀表达式,当遇到数字时,直接输出为后缀表达式的一部分(注:中缀表达式中数字的顺序和后缀表达式中数字的顺序是相同的);当遇到运算符时,则借助运算符栈进行运算.
a,当遇到"(",即左括号时,其后遇到的运算符都直接入栈,直到遇到")",即右括号时,将不断出栈至后缀表达式,直到栈顶运算符为"("左括号(注:左右括号都不能作为后缀表达式的一部分,因为后缀表达式不需要括号).
b,当栈顶运算符的优先级高于当前扫描到的运算符时,需要全部将优先级不低于当前运算符从栈中全部输出至后缀表达式,然后才能将当前运算符入栈.
步骤:
1) ->"9":
直接输出至表达式(即作为后缀表达式的一部分).
此时后缀表达式为: 9
此时栈为空.
2) ->"+"号:
由于栈为空,所以直接将"+"号压栈.此时栈内容为:

此时后缀表达式为: 9
3) -> "("号:
将"("压栈,此时栈内容为:
此时后缀表达式为:9
4) -> "3":
直接输出至后缀表达式,此时后缀表达式为: 9 3
5) -> "-":
将"-"(减号)压栈,此时栈内容为:
后缀表达式为: 9 3
6) ->"1":
将"1"直接输出到后缀表达式即可,此时后缀表达式为:9 3 1
7) ->")":
此时找到右括号,不压栈,相反,要出栈直到输出"("为止. 注:但是不将"("输出至后缀表达式,因为后缀表达式不需要括号.
此时后缀表达式为: 9 3 1 -
此时栈内容为:
8) -> "*"(乘号):
由于"*"优先级高于栈底的"+"号,所以进栈,此时栈内容为:
此时后缀表达式为: 9 3 1 -
9) ->"3":
直接输出至后缀表达式,此时后缀表达式为: 9 3 1 - 3
10) ->"+":
由于此时栈顶运算符"*"优先级高于"+",且没有比"+"优先级更低的运算符,所以全部出栈.并将当前运算符"+"压栈.
此时栈为内容为:
此时后缀表达式为: 9 3 1 - 3 * +
11) ->"10":
直接输出至后缀表达式,此时后缀表达式为: 9 3 1 - 3 * + 10
12) ->"/":
由于"/"的优先级高于"+",所以讲"/"压栈,此时栈的内容为:
此时后缀表达式为: 9 3 1 - 3 * + 10
13) ->"2":
直接输出至缀表达式,此时后缀表达式为: 9 3 1 - 3 * + 10 2
14) 终点:
由于到了表达式结尾,将栈的内容全部输出至表达式,此时最终表达式为: 9 3 1 - 3 * + 10 2 / +

浙公网安备 33010602011771号