中綴表示式轉換成字尾表示式 棧

2021-08-02 13:20:30 字數 2033 閱讀 6063

字尾表示式嚴格按照從左到右進行計算的模式,符合計算機執行方式,而中綴表示式需要計算機遇到符號後向後掃瞄一位,若為括號或優先順序更高的操作符還需要向後繼續掃瞄。

設我們欲將中綴表示式 a+b*c+(d*e+f)*g轉換成字尾表示式,正確的答案為:abc*+de*f+g*+

當我們讀入運算元的時候,立即將其放入到輸出中,操作符不立即輸出,將其放入棧中。如果我們見到乙個右括號,那麼我們就從棧中彈出棧元素直至遇到乙個左括號,左右括號都只被彈出而不輸出。

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

最後,如果我們讀到輸入的末尾,我們將棧元素彈出直至該棧變成空棧,將符號寫到輸出中。

規則很多,還是用例項比較容易說清楚整個過程。以上面的轉換為例,輸入為a + b * c + (d * e + f)*g,處理過程如下:

1)首先讀到a,直接輸出。

2)讀到「+」,將其放入到棧中。

3)讀到b,直接輸出。

此時棧和輸出的情況如下:

4)讀到「*」,因為棧頂元素」+」優先順序比」 * 」 低,所以將」 * 「直接壓入棧中。

5)讀到c,直接輸出。

此時棧和輸出情況如下:

6)讀到」 + 「,因為棧頂元素」 * 「的優先順序比它高,所以彈出」 * 「並輸出, 同理,棧中下乙個元素」 + 「優先順序與讀到的操作符」 + 「一樣,所以也要彈出並輸出。然後再將讀到的」 + 「壓入棧中。

此時棧和輸出情況如下:

7)下乙個讀到的為」(「,它優先順序最高,所以直接放入到棧中。

8)讀到d,將其直接輸出。

此時棧和輸出情況如下:

9)讀到」 * 「,由於只有遇到」 ) 「的時候左括號」(「才會彈出,所以」 * 「直接壓入棧中。

10)讀到e,直接輸出。

此時棧和輸出情況如下:

11)讀到」 + 「,彈出」 * 「並輸出,然後將」+」壓入棧中。

12)讀到f,直接輸出。

此時棧和輸出情況:

13)接下來讀到「)」,則直接將棧中元素彈出並輸出直到遇到」(「為止。這裡右括號前只有乙個操作符」+」被彈出並輸出。

14)讀到」 * 「,壓入棧中。讀到g,直接輸出。

15)此時輸入資料已經讀到末尾,棧中還有兩個操作符「*」和」 + 「,直接彈出並輸出。

至此整個轉換過程完成。程式實現**後續再補充了。

1)先按照運算子的優先順序對中綴表示式加括號,變成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )

2)將運算子移到括號的後面,變成((a(bc)*)+(((de)*f)+g)*)+

3)去掉括號,得到abc*+de*f+g*+

中綴表示式轉換成字尾表示式

一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...

中綴表示式轉換成字尾表示式

中綴表示式轉字尾表示式 思路 三個方法 將中綴表示式轉換成 中綴表示式對應的 list 自定義運算子優先順序 將中綴表示式對應的 list 轉換成 字尾表示式.1.1 使用 list 更好的和 stack 配合,list 比 字串的遍歷更加靈活.將中綴表示式對應的 list 轉換成 字尾表示式 2....

中綴表示式轉換成字尾表示式

優先順序 如果輸入運算子的優先順序低於或等於棧頂的操作符優先順序,則棧內元素進入輸入佇列,輸入運算子入棧。乙個簡單的例子 演算法示意圖,使用了3個空間。輸入用符號代替,如果輸入是乙個數字則直接進輸出佇列,即圖中 b d f h 如果輸入是運算子,則壓入操作符堆疊,即圖中 c e 但是,如果輸入運算子...