1. 程式人生 > >中綴表示式與字尾表示式之間的互轉及求值

中綴表示式與字尾表示式之間的互轉及求值

  • 中綴表示式:常見的運算表示式,如(3+4)×5-6
  • 字首表示式又稱波蘭式:運算子位於運算元之前,比如:- × + 3 4 5 6
  • 字尾表示式又稱逆波蘭表示式:與字首表示式相似,只是運算子位於運算元之後,如:3 4 + 5 × 6 -

中綴表示式轉字尾表示式

  • 從左到右掃描表示式
  • 若遇到數字,輸出
  • 若遇到運算子時:
    • 遇到“(”,直接壓入棧,
    • 遇到運算子,和棧頂的運算子比較優先順序,
      • 優先順序高的話直接壓入棧,
      • 優先順序低的話,輸出棧頂元素且棧頂元素出棧,然後繼續和新的棧頂元素比較優先順序,直至它的優先順序高於棧頂元素時,把它壓入棧
      • 若平級,就按先棧裡的優先順序高來算
    • 遇到“)”,依次彈出棧頂元素並輸出,直至遇到“(”後,左括號出棧
  • 掃描結束後若棧中不為空依次彈出
    例: 2*(9+6/3-5)+4
    從左到右開始掃描
  1. 掃描到2,輸出

    此時輸出串為:2
    運算子棧為:NULL

  2. 掃描到*,入棧

    此時輸出串為:2
    運算子棧為:*

  3. 掃描到(,入棧

    此時輸出串為:2
    運算子棧為:*(

  4. 掃描到 9,輸出

    此時輸出串為:2 9
    運算子棧為:*(

  5. 掃描到 +,優先順序高於 ( ,入棧

    此時輸出串為:2
    運算子棧為:*(+

  6. 掃描到 6 ,輸出

    此時輸出串為:296
    運算子棧為:*(+

  7. 掃描到 /,優先順序大於 +,入棧

    此時輸出串為:296
    運算子棧為:*(+/

  8. 掃描到 3,輸出

    此時輸出串為:2963
    運算子棧為:*(+/

  9. 掃描到 -,優先順序低於 / ,所以 / 出棧並輸出,

    此時輸出串為:2963/
    運算子棧為:*(+

    然後 - 和 +比較,因為+號在棧裡,所以+ 出棧並輸出

    此時輸出串為:2963/+
    運算子棧為:*(

    因為 - 優先順序高於 (,-入棧

    此時輸出串為:2963/+
    運算子棧為:*(-

  10. 遇到5,輸出

    此時輸出串為:2963/+5
    運算子棧為:*(-

  11. 遇到 ) ,彈出 -並輸出 ,

    此時輸出串為:2963/+5-
    運算子棧為:*(

    遇到了 ( ,( 出棧

    此時輸出串為:2963/+5-
    運算子棧為:*

  12. 掃描到 +,優先順序低於 * ,* 出棧並輸出,然後+入棧

    此時輸出串為:2963/+5-*
    運算子棧為:+

  13. 掃描到4,輸出

    此時輸出串為:2963/+5-*4
    運算子棧為:+

  14. 掃描結束,將棧中元素依次出棧輸出

    此時輸出串為:2963/+5-*4+
    運算子棧為:NULL

結果: 2*(9+6/3-5)+4的字尾表示式為 2963/+5-*4+

字尾表示式轉為中綴表示式

  • 從左到右掃描運算子
  • 遇到第運算子時,找打緊挨著他的前面兩個相鄰的數字,執行運算並把它們看成一個整體的數字
  • 依次類推
    例: 2963/+5-*4+
  1. 從左到右掃描,遇到第一個運算子 /,緊挨著他的前面兩個相鄰的數字是6和3
    執行6/3並把它們看成一個整體的數字,如下

    296/3 +5-*4+

  2. 遇到 +,緊挨著他的前面兩個相鄰的數字是9和6/3
    執行9+6/3

    29+6/35-*4+

  3. 遇到 - ,緊挨著他的前面兩個相鄰的數字是9+6/3和5
    執行9+6/3 - 5

    29+6/3-5*4+

  4. 遇到 ,緊挨著他的前面兩個相鄰的數字是2和9+6/3-5
    執行2
    *(9+6/3 - 5)

    2*(9+6/3-5)4+

  5. 遇到 +,緊挨著他的前面兩個相鄰的數字是2*(9+6/3-5)和4
    執行2*(9+6/3 - 5)+4

    2*(9+6/3-5)+4

  6. 結果:2*(9+6/3-5)+4

字尾表示式求值

  • 參考上面字尾轉中綴,每執行一次就計算一次即可。
    如上例:
    執行6/3=2
    執行9+2=11
    執行11-5=6
    執行2*6=12
    執行12+4=16
    結果:16