《大話資料結構3》中綴表示式轉換為字尾表示式
中綴表示式轉換為字尾表示式
一、表示式的三種形式:
● 中綴表示式:運算子放在兩個運算物件中間,如:(2+1)*3。我們從小做數學題時,一直使用的就是中綴表示式。
● 字尾表示式:不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則),如:2 1 + 3 *。又比如3+(6-4/2)*5=23的字尾表示式為:3642/-5*+# (#符號為結束符)。字尾表示式 也叫做逆波蘭表示式。
● 字首表示式:同字尾表示式一樣,不包含括號,運算子放在兩個運算物件的前面,如:* + 2 1 3 。字首表示式和字尾表示式其實是差不多的,只不過符號位置不同而已,字首表示式不是很常見。
二、中綴表示式轉換為字尾表示式:(思路)
● 從左到右依次遍歷中輟表示式的每個數字和符號
(1)若是數字、就輸出;成為後輟表示式的一部分。
(2)若是符號,則判斷當前的符號與棧頂符號的優先順序,
若是右括號“ )”,我們要去匹配前面的左括號 “ ( ”,然後棧頂元素依次往下出棧, 直到遇到 “ ( ”。 輸出的時候把 “ ( ” 括號 和 “ ) ” 括號之間的數字或符號成為後輟表示式的一部分, 左括號和右括號我們就丟棄不要了。
若是當前的符號低於棧頂的符號或者優先順序等於當前的符號,那麼從棧頂開始,依次彈出比當前處理的運算子優先順序高的運算子,直到一個比它優先順序低的或者遇到了一個左括號就停止。
(3)然後將當前的符號進棧。
(4) 重複迴圈,直到最終輸出後輟表示式的為止。
與二叉樹關係
字首表示式對應於二叉樹的前序遍歷
中綴表示式對應於二叉樹的中序遍歷
字尾表示式對應於二叉樹的後序遍歷
根據中綴表示式生成二叉樹
表示式“X=A+B*(C-D)/E”的字尾表示形式可以為?
按照操作符的優先順序,其二叉樹的生成過程:
1.括號的優先順序最高,根為-,左孩子為C,右孩子為D
2.接下來是乘法,根為*,左孩子為B,右孩子為1的樹
3.接下來是除法,跟為/,左孩子為2的樹,右孩子為E
4.接下來是加法,根為+,左孩子為A,右孩子為3的樹
5.接下來是=號,左孩子是X,右孩子是4的樹
剩下的就是前序和後序遍歷二叉樹即可。
其結果為:後序遍歷序列是: XABCD-*E/+=
運用字尾表示式進行計算:
(1)建立一個棧S;
(2)從左到右讀後綴表示式,讀到數字就將它轉換為數值壓入棧S中,讀到運算子則從棧中依次彈出兩個數分別到Y和X,然後以“X 運算子 Y”的形式計算機出結果,再壓加棧S中;
(3)如果字尾表示式未讀完,就重複上面過程,最後輸出棧頂的數值則為結束。
舉例:
3+(2-5)*6/3=-3 ,其後綴表示式為:325-6*3/+。其運算結果如下:
後輟表示式計算結果
規則:
從左到右遍歷表示式的每個數字和符號,運到數字就進棧,
運到的是符號,就將處於棧頂兩個數字出棧, 進行運算。
運算結果進棧。
重複步驟,一直運算到結果為止。
注意: 如果我們見到任何其他的符號(+,*,(),那麼我們從棧中彈出棧元素直到發現優先順序更低的元素為止。有一個例外:除非是在處理一個)的時候,否則我們決不從棧中移走(。對於這種操作,+的優先順序最低,而(的優先順序最高。當從棧彈出元素的工作完成後,我們再將操作符壓入棧中。