在開始之前,我們首先要了解以下運算子在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.初始化一空棧,用來對符號進出棧使...