C語言 將中綴表示式轉化為字尾表示式

2021-09-02 18:52:22 字數 2450 閱讀 5041

在開始之前,我們首先要了解以下運算子在c語言中的優先順序:

()    ——圓括號

* / % ——乘、除、求餘運算子

+ - ——加、減運算子

優先順序由高到低排列!

中綴表示式是什麼?

對於乙個表示式,我們平時是這樣寫的:

(3 + 2) ÷ 5 × 3

這樣的乙個表示式就是中綴表示式(也稱中序表示式),但由於這種表示式不容易被計算機解析,所以我們需要將其轉化為字尾表示式!

字尾表示式是什麼?

對於上面的表示式,轉化為後序表示式後,是這樣寫的:

3 2 + 5 ÷ 3 ×

可以看到,後序表示式去掉了圓括號,並且把數字之間的運算子移到了它們之後。

如何將中綴表示式轉化為字尾表示式?

開始之前,先讓我們來了解以下規則:

建立符號棧

按順序掃瞄中序表示式

(1)若掃瞄到數字,加入到字尾表示式中

(2)若掃瞄到運算子

a. 若為 『(』,入棧;

b. 若為 『)』,則依次把棧中的的運算子加入字尾表示式中,直到出現』(』,從棧中刪除』(』 ;

c. 若為 除括號外的其他運算子, 當其優先順序高於除』(『以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到遇到乙個比它優先順序低的或者遇到了乙個』('為止,然後將其自身壓入棧中(先出後入)。

掃瞄完成,將棧中剩餘符號依次加入到字尾表示式中。

依舊以上面的表示式為例,我們一步一步來!

(3 + 2) / 5 * 3

開始掃瞄:

遇到』(』:根據規則a,直接入棧

字尾表示式:

符號棧:(

遇到』3』:掃瞄到數字,加入到字尾表示式中

字尾表示式:3

符號棧:(

遇到』+』:根據規則c,其優先順序高於除』('以外的棧頂運算子時,直接入棧

字尾表示式:3

符號棧:( +

遇到』2』:掃瞄到數字,加入到字尾表示式中

字尾表示式:3 2

符號棧:( +

遇到』)』:根據規則b,依次把棧中的的運算子加入字尾表示式中,直到出現』(』,從棧中刪除』(』

字尾表示式:3 2 +

符號棧:

遇到』/』:根據規則c,其優先順序高於除』('以外的棧頂運算子時,直接入棧

字尾表示式:3 2 +

符號棧:/

遇到』5』:掃瞄到數字,加入到字尾表示式中

字尾表示式:3 2 + 5

符號棧:/

遇到『*』:根據規則c,此時棧內有』/』,所以從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到遇到乙個比它優先順序低的或者遇到了乙個』('為止,然後將其自身壓入棧中(先出後入)。

字尾表示式:3 2 + 5 /

符號棧:*

遇到』3』:掃瞄到數字,加入到字尾表示式中

字尾表示式:3 2 + 5 / 3

符號棧:*

掃瞄完成,將棧中剩餘符號依次加入到字尾表示式中。

字尾表示式:3 2 + 5 / 3 *

符號棧:

字尾表示式應該怎麼計算?

以上面的字尾表示式為例

3 2 + 5 / 3 *

開始掃瞄

①遇到數字』3』,入棧;遇到數字』2』,入棧

棧:3 2

②遇到』+』,取棧頂兩個數字作加法運算,3+2=5,接著將』5』入棧

棧:5

③遇到數字』5』,入棧

棧:5 5

④遇到』/』,其棧頂兩個數字做除法運算,5/5=1,接著將』1』入棧

棧:1

⑤遇到數字』3』,入棧

棧:1 3

⑥遇到』*』,取棧頂兩個數字做乘法運算,1×3=3,接著將』3』入棧

棧:3

⑦掃瞄完畢,將棧內元素輸出即為表示式的答案。

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

我們把平時所用的標準四則運算表示式,即 9 3 1 3 10 2 叫做中綴表示式。因為所有的運算符號都在兩數字的中間,現在我們的問題就是中綴到字尾的轉化。中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 9 3 1 3 10 2 下面我們來具體看看這個過程。1.初始化一空棧,用來對符號進出棧使...

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

我們把平時所用的標準四則運算表示式,即 9 3 1 3 10 2 叫做中綴表示式。因為所有的運算符號都在兩數字的中間,現在我們的問題就是中綴到字尾的轉化。所謂字尾表示式是指這樣的乙個表示式 式中不再引用括號,運算符號放在兩個運算物件之後,所有計算按運算符號出現的順序,嚴格地由左而右新進行 不用考慮運...

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

我們把平時所用的標準四則運算表示式,即 9 3 1 3 10 2 叫做中綴表示式。因為所有的運算符號都在兩數字的中間,現在我們的問題就是中綴到字尾的轉化。中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 9 3 1 3 10 2 下面我們來具體看看這個過程。1.初始化一空棧,用來對符號進出棧使...