算术表达式的求值法

如(6*2+5*9)/2的这类表达式称为中序表示法,这是一般人所习惯的的写法。不过由于中序法优先权和结合性的问题,在计算机编译程序的处理上很不方便,所以在计算机的上的解决之道是将其换成后序法(较常用)和前序法,这种表达式的种类,依据运算符在表达式中的位置,可以将其分为中序法、前序法、后续法。

  • 中序法:<操作数1><运算符><操作数2>
  • 前序法:<运算符><操作数1><操作数2>
  • 后序法:<操作数1><操作数2><运算符>

以下介绍几种解析算术表达式的方法以及求值方法:

一、括号法

1、中序转前序

    (1)将中序表达式根据顺序用括号完整的括起来
    (2)移动所有的运算符来取代所有的左括号,并以最近者为原则
    (3)将所有的右括号去掉

2、中序转后序

    (1)将中序表达式根据顺序用括号完整的括起来
    (2)移动所有的运算符来取代所有的右括号,并以最近者为原则
    (3)将所有的左括号去掉

3、分析

    例如2*3+4*5,中序转前序:

    第一步:((2*3)+(4*5))
    第二步:+*23)*45))
    第三步:+*23*45

    中序转后序:

    第一步:((2*3)+(4*5))
    第二步:((23*(45*+
    第三步:23*45*+

二、堆栈法

这里只介绍中序转后序,中序转前序类似,篇幅限制不再介绍。

1、中序转后序步表达式的步骤

    (1)从左向右依次取得数据ch。
    (2)如果ch是操作数,直接输出。
    (3)如果ch是运算符(含左右括号),则:
          a:如果ch = '(',放入堆栈。
          b:如果ch = ')',依次输出堆栈中的运算符,直到遇到'('为止。
          c:如果ch不是')'或者'(',那么就和堆栈顶点位置的运算符top做优先级比较。
              1:如果ch优先级比top高,那么将ch放入堆栈。
              2:如果ch优先级低于或者等于top,那么输出top,然后将ch放入堆栈。
    (4)如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出。

2、分析

以A-B*(C+D)/E为例进行分析: