后綴表達式


 

后綴表達式

不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則,如:(2 + 1) * 3 , 即2 1 + 3 *

 

中綴表達式

是一個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處於操作數的中間(例:3 + 4),中綴表達式是人們常用的算術表示方法。

 

前綴表達式

前綴表達式就是不含括號的算術表達式,而且它是將運算符寫在前面,操作數寫在后面的表達式,為紀念其發明者波蘭數學家Jan Lukasiewicz也稱為“波蘭式”。例如,- 1 + 2 3,它等價於1-(2+3)。

 

使用棧,可以實現中綴表達式向后綴表達式的轉化。

 

例子:a+b*c+(d*e+f)*g轉換成abc*+de*f+g*+

 

轉換原則:

 

1.當讀到一個操作數時,立即將它放到輸出中。操作符則不立即輸出,放入棧中。遇到左圓括號也推入棧中。

2.如果遇到一個右括號,那么就將棧元素彈出,將符號寫出直到遇到一個對應的左括號。但是這個左括號只被彈出,並不輸出。

3.在讀到操作符時,如果此時棧頂操作符優先性大於或等於此操作符,彈出棧頂操作符直到發現優先級更低的元素位置。除了處理)的時候,否則決不從棧中移走"("。操作符中,+-優先級最低,()優先級最高。

4.如果讀到輸入的末尾,將棧元素彈出直到該棧變成空棧,將符號寫到輸出中。

關鍵點:1.只有操作符進棧,操作數放在輸出中。

               2.當一個操作符進棧時,棧中不能有優先級比自己大或者相同的操作符。

               3.左括號直接進棧,遇右括號時,棧中元素一直出棧直到左括號。

 

 

解如下:

首先,讀入a,並送到輸出,然后+被讀入並壓入棧中。接下來b讀入並送到輸出,此時狀態如下:

stack:                                        輸出:a b

           +

back  top

 

接下來讀入*,由於優先性比棧頂元素+大(原則3),因此被壓入棧頂,接着讀入c,並送到輸出:

stack:                                      輸出:a b c

        + *

back top

 

然后讀入+,由於此時棧頂元素為*,優先級比+大,因此將*彈出,彈出后原來的+變成棧頂元素,由於+的優先性和當前讀入的+優先性相等,因此也被彈出(原則3),最后將讀入的+壓入棧中。因此此時狀態如下:

stack:                                       輸出:a b c * +

            +

back  top

 

下一個讀入的符號是(,由於具有最高優先級,因此將其放入棧中,然后讀入d:

stack:                                       輸出:a b c * + d

             + (

back     top

 

繼續讀入,此時讀入*,除非處理),否則(決不彈出(原則3),因此*被壓入棧中,接下來讀入e,並送到輸出:

stack:                                      輸出:a b c * + d e

             + ( *

back        top

 

再往后讀入的符號是+,將*彈出並輸出。(原則3,與之前步驟相似),然后將+壓入棧中,接着讀入f並送到輸出:

stack:                               輸出:a b c * + d e * f

           + ( +

back       top

 

現在讀入),因此彈出棧元素直到遇到“(”(原則2):

stack:                                輸出: a b c * + d e * f +

            +

back  top

 

下面又讀入一個*,被壓入棧中,然后讀入g並輸出:

stack:                                    輸出: a b c * + d e * f + g

          + *

back   top

 

現在輸入為空,彈出棧中所有元素:

stack :                                    輸出: a b c * + d e * f + g * +

empty         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM