中綴表示式與字尾表示式之間的互轉及求值
阿新 • • 發佈:2018-11-10
- 中綴表示式:常見的運算表示式,如(3+4)×5-6
- 字首表示式又稱波蘭式:運算子位於運算元之前,比如:- × + 3 4 5 6
- 字尾表示式又稱逆波蘭表示式:與字首表示式相似,只是運算子位於運算元之後,如:3 4 + 5 × 6 -
中綴表示式轉字尾表示式
- 從左到右掃描表示式
- 若遇到數字,輸出
- 若遇到運算子時:
- 遇到“(”,直接壓入棧,
- 遇到運算子,和棧頂的運算子比較優先順序,
- 優先順序高的話直接壓入棧,
- 優先順序低的話,輸出棧頂元素且棧頂元素出棧,然後繼續和新的棧頂元素比較優先順序,直至它的優先順序高於棧頂元素時,把它壓入棧
- 若平級,就按先棧裡的優先順序高來算
- 遇到“)”,依次彈出棧頂元素並輸出,直至遇到“(”後,左括號出棧
- 掃描結束後若棧中不為空依次彈出
例: 2*(9+6/3-5)+4
從左到右開始掃描
-
掃描到2,輸出
此時輸出串為:2
運算子棧為:NULL -
掃描到*,入棧
此時輸出串為:2
運算子棧為:* -
掃描到(,入棧
此時輸出串為:2
運算子棧為:*( -
掃描到 9,輸出
此時輸出串為:2 9
運算子棧為:*( -
掃描到 +,優先順序高於 ( ,入棧
此時輸出串為:2
運算子棧為:*(+ -
掃描到 6 ,輸出
此時輸出串為:296
運算子棧為:*(+ -
掃描到 /,優先順序大於 +,入棧
此時輸出串為:296
運算子棧為:*(+/ -
掃描到 3,輸出
此時輸出串為:2963
運算子棧為:*(+/ -
掃描到 -,優先順序低於 / ,所以 / 出棧並輸出,
此時輸出串為:2963/
運算子棧為:*(+然後 - 和 +比較,因為+號在棧裡,所以+ 出棧並輸出
此時輸出串為:2963/+
運算子棧為:*(因為 - 優先順序高於 (,-入棧
此時輸出串為:2963/+
運算子棧為:*(- -
遇到5,輸出
此時輸出串為:2963/+5
運算子棧為:*(- -
遇到 ) ,彈出 -並輸出 ,
此時輸出串為:2963/+5-
運算子棧為:*(遇到了 ( ,( 出棧
此時輸出串為:2963/+5-
運算子棧為:* -
掃描到 +,優先順序低於 * ,* 出棧並輸出,然後+入棧
此時輸出串為:2963/+5-*
運算子棧為:+ -
掃描到4,輸出
此時輸出串為:2963/+5-*4
運算子棧為:+ -
掃描結束,將棧中元素依次出棧輸出
此時輸出串為:2963/+5-*4+
運算子棧為:NULL
結果: 2*(9+6/3-5)+4的字尾表示式為 2963/+5-*4+
字尾表示式轉為中綴表示式
- 從左到右掃描運算子
- 遇到第運算子時,找打緊挨著他的前面兩個相鄰的數字,執行運算並把它們看成一個整體的數字
- 依次類推
例: 2963/+5-*4+
- 從左到右掃描,遇到第一個運算子 /,緊挨著他的前面兩個相鄰的數字是6和3
執行6/3並把它們看成一個整體的數字,如下296/3 +5-*4+
- 遇到 +,緊挨著他的前面兩個相鄰的數字是9和6/3
執行9+6/329+6/35-*4+
- 遇到 - ,緊挨著他的前面兩個相鄰的數字是9+6/3和5
執行9+6/3 - 529+6/3-5*4+
- 遇到 ,緊挨著他的前面兩個相鄰的數字是2和9+6/3-5
執行2*(9+6/3 - 5)2*(9+6/3-5)4+
- 遇到 +,緊挨著他的前面兩個相鄰的數字是2*(9+6/3-5)和4
執行2*(9+6/3 - 5)+42*(9+6/3-5)+4
- 結果:2*(9+6/3-5)+4
字尾表示式求值
- 參考上面字尾轉中綴,每執行一次就計算一次即可。
如上例:
執行6/3=2
執行9+2=11
執行11-5=6
執行2*6=12
執行12+4=16
結果:16