中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法
給出下面乙個例子:
我們把中綴表示式「9+(3-1)*3+10/2」轉化為字尾表示式
1.首先初始化乙個空棧,用來對符號進出棧使用
2.第乙個字元是數字9,輸出9,將後面的符號『+』進棧 +
3.第三個字元是『(』,進棧 (
+4.第四個字元為3,輸出,將其後面的-號入棧,現在的輸出為9 3 -
(+5.接著將1輸出,現在輸出為9 3 1,因其後面為右括號『)』,與前面的『(』匹配,將『(』開始的棧內元素輸出,現在輸出為9 3 1-(括號不顯示),棧如下: +
6.接著為『*』,入棧,後面的3輸出,現在輸出為9 3 1 – 3 *
+7.數字3後面為『+』,棧頂『*』的優先順序大於『+』,故出棧,由於棧中沒有比『+』優先順序低的字元,故全部出棧,此時輸出為:
9 3 1 – 3 * +,然後將這個『+』入棧(是將* + 出棧之後它才入棧,),此時棧為: +
8.接著為字元10,輸出,將『/』入棧,此時輸出為:9 3 1 – 3* + 10
棧為: /
+9.剩下最後乙個數字2,將其輸出,然後將棧中字元全部出棧,最後輸出結果為:9 3 1 – 3 * + 10 2 / +
看了上面的例子之後我們來總結一下套路:
1) 首先遇到數字就直接輸出
2) 當遇到運算子時:
如果是右括號,則將從左括號開始的元素出棧(括號不顯示),
如果不是右括號且前面有個左括號,直接入棧,
其餘情況下比較與棧頂元素的優先順序,優先順序比棧頂元素不比棧頂元素高,則棧頂元素出棧,再次比較直到棧空或優先順序比棧頂元素高,當前運算子入棧。
以上是利用棧來求解字尾表示式,下面我們利用樹來求解
還是上面的例子
9+(3-1)*3+10/2,我們先把表示式轉化為二叉樹
我們先按照優先順序給表示式加上括號:
1.((9+(3-1)*3)+(10/2))
2.能看出此時式子分為2部分(9+(3-1)*3) 和(10/2)
故以『+』作為根節點,(9+(3-1)*3)作為左子樹,(10/2)作為右子樹
3.我們先看左邊,(9+(3-1)*3)也可分為2部分:左邊為9,右邊為(3-1)*3,故以『+』作為根節點,數字9作為左子樹,(3-1)*3作為右子樹,(3-1)*3又可分為(3-1)和3,(3-1)又可分為3和1兩部分,轉化為樹如圖:
4.右邊可以/為根節點,10為左子樹,2為右子樹 如圖
表示式9+(3-1)*3+10/2對應的二叉樹就如上圖所示,我們對這棵二叉樹進行遍歷,採取前序遍歷得到的就是字首表示式,採取中序遍歷得到的就是中綴表示式,採取後序遍歷得到的就是字尾表示式。
我們要求得其字尾表示式,故對其進行後序遍歷,先遍歷其左子樹,後遍歷其右子樹,最後遍歷根結點,最後結果為:
9 3 1 – 3 * + 10 2 / +
以上就是中綴表示式轉化為字尾表示式的兩種方法,希望能對各位讀者有所幫助。
參考自《大話資料結構》一書
中綴表示式轉化為字尾表示式
注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...
中綴表示式轉化為字尾表示式
中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...
中綴表示式轉化為字尾表示式
具體操作如下 1 遇到數字,直接將其輸出。2 遇到運算子,且棧頂元素優先順序低於當前運算子優先順序,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。3 遇到運算子,且棧頂元素優先順序高於或等於當前運算子優先順序,則彈出棧中元素,直至棧空或棧頂元素優先順序低於當前運算子優先順序。再將遇到的運算子...