目錄
中綴表達式就是我們數學中常用的那種表達式,本文打算以中綴表達式:1 + (2 + 3) × 4 - 5 爲例,分享一下前綴表達式和後綴表達式的如何形成與在計算機如何計算前後最表達式和後綴表達式
1、前綴表達式和後綴表達式的形成
前綴表達式和後綴表達式中的這個“綴”就是指符號的移動方向(通俗來說,就是符號統一朝哪邊靠)
前綴表達式和後綴表達式形成都是對於整個中綴表達式按照運算順序見運算符就加括號,保證每個運算符外面一定要有括號(原本有就沒必要加了),然後每個符號挪到自己那層括號的外面(前綴是前面,後綴是後面),然後去掉括號。
中綴表達式:1 + (2 + 3) × 4 - 5
((1 +((2 + 3) × 4))- 5)
前綴表達式:- (+(1 ×(+(2 3) 4))5),去掉括號得: - +1×+2345
後綴表達式: ((1 ((2 3) + 4)×)+5)-,去掉括號得: 123+4×+5-
這樣前綴表達式和後綴表達式就出來了。
那如何在機器層面將中綴表達式變成後綴表達式和前綴表達式
1.1、中綴表達式轉前綴表達式
1)設置一個符號棧S,一個數字棧D
2)從中綴表達式右邊開始遍歷
3)遇到數字,壓入數字棧D
遇到右括號,壓入符號棧S
遇到運算符,如果符號棧棧頂爲右括號,當前運算符直接入符號棧
如果符號棧棧頂運算符優先級小於等於當前運算符,當前運算符也直接入符號棧
如果符號棧棧頂運算符優先級大於當前運算符,那就棧頂元素出棧然後入棧數字棧,接着繼續比較,直 到棧頂元素爲右括號或者優先級小於等於當前運算符的運算符。
遇到左括號,符號棧開始出棧,出棧元素依次進入數字棧,直到遇見右括號爲止(右括號不入數字棧,和左括號一起刪掉)
圖示過程如下(中綴表達式:1 + (2 + 3) × 4 - 5):
1.2、中綴表達式轉後綴表達式
1、設置一個符號棧S,一個隊列Q
2、從中綴表達式左邊開始遍歷
3、遇到數字,入隊列D
遇到左括號,壓入符號棧S
遇到運算符,如果符號棧棧頂爲左括號,當前運算符直接入符號棧
如果符號棧棧頂運算符優先級小於當前運算符,當前運算符也直接入棧
如果符號棧棧頂運算符優先級大於等於當前運算符,那就棧頂元素出棧然後入棧數字棧,接着繼續比較,直 到棧頂元素爲右括號或者優先級小於當前運算符的運算符。
遇到右括號括號,符號棧開始出棧,出棧元素依次進入數字棧,直到遇見左括號爲止(右括號不入隊列,和左括號一起刪掉)
圖示過程如下(中綴表達式:1 + (2 + 3) × 4 - 5):
1.3、注意點 (重點)
中綴表達式轉前綴表達式的時候,在比較運算符的優先級的時候,同優先級的不出棧
中綴表達式轉後綴表達式的時候,在比較運算符的優先級的時候,同優先級的出棧
是因爲前綴表達式是從後往前去解析,同優先級下先入棧的應該後運算,所以不需要出棧(判斷是大於即可),後面一起出棧是爲了保證按照原本順序運算。
而後綴表達式本身順序就是按照從前往後解析,同優先級下先入棧的應該先出棧運算,所以需要出棧(是判斷大於等於纔行)。
2、前綴表達式和後綴表達式在計算機中如何計算。
2.1、計算前綴表達式的值
前綴表達式: - +1×+2345。前綴表達式從後向前讀取表達式,遇到數字就壓入棧,遇到符號就彈出兩個數字用當前運算符進行操作。
- +1×+2345
剩餘表達式 |
當前元素 | 棧 | 值 |
- +1×+234 | 5 | 5 | NULL |
- +1×+23 | 4 | 45 | NULL |
- +1×+2 | 3 | 345 | NULL |
- +1×+ | 2 | 2345 | NULL |
- +1× | + | 45 | 2+3 = 5 |
- +1 | × | 5 | 5*4 = 20 |
- + | 1 | 15 | 20 |
- | + | 5 | 20+1= 21 |
- | 21-5 = 16 | ||
2.2、計算後綴表達式的值
後綴表達式: 123+4×+5-。後綴表達式從前向後讀取表達式,遇到數字就壓入棧,遇到符號就彈出兩個數字用當前運算符進行操作。
你,總要埋頭去做一些事情,不是嗎