1. 程式人生 > >《大話資料結構3》中綴表示式轉換為字尾表示式

《大話資料結構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/+。其運算結果如下:

45270e43-7c61-4ac2-af8f-efb437e8d742


後輟表示式計算結果


 這裡寫圖片描述

規則:

從左到右遍歷表示式的每個數字和符號,運到數字就進棧,

運到的是符號,就將處於棧頂兩個數字出棧, 進行運算。

運算結果進棧。

重複步驟,一直運算到結果為止。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

注意: 如果我們見到任何其他的符號(+,*,(),那麼我們從棧中彈出棧元素直到發現優先順序更低的元素為止。有一個例外:除非是在處理一個)的時候,否則我們決不從棧中移走(。對於這種操作,+的優先順序最低,而(的優先順序最高。當從棧彈出元素的工作完成後,我們再將操作符壓入棧中。