中綴表示式轉化為字尾表示式

2021-08-10 17:03:10 字數 1740 閱讀 7420

中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法

給出下面乙個例子:

我們把中綴表示式「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 遇到運算子,且棧頂元素優先順序高於或等於當前運算子優先順序,則彈出棧中元素,直至棧空或棧頂元素優先順序低於當前運算子優先順序。再將遇到的運算子...