中缀表达式 转 后缀表达式.

  概述:中缀表达式就是我们常常在数学上用的运算符在中间,运算数在旁边的表达式:如 : 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 / +

posted @ 2014-09-16 15:59  wonkju  阅读(722)  评论(0)    收藏  举报