1. 程式人生 > >算術表示式的求值法

算術表示式的求值法

如(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為例進行分析: