中綴表示式轉字尾表示式

2022-03-14 06:45:29 字數 2029 閱讀 2277

shunting yard演算法(排程場演算法)是乙個用於將中綴表示式轉換為字尾表示式的經典演算法,由艾慈格.迪傑斯特拉引入,因其操作類似於火車編組場而得名。

例如:3+4

1)將3入輸出佇列(每當輸入乙個數字時,直接進入輸出佇列)

2)將+號壓入運算堆疊

3)將4入輸出佇列

4)輸入結束,將操作符堆疊中剩餘操作符入輸出佇列

通過這個例子可以簡單的看出兩個規則:

二、詳細的演算法

1、讀入乙個記號

如果棧頂為空,直接將該操作符o壓入棧;

如果該操作符o是左結合性的,

棧頂的操作符o的優先順序大於或等於該操作符的優先順序,則彈出棧頂的操作符,然後將操作符o壓入棧。否則不彈出,並將操作符o壓入棧。

如果該操作符是右結合性的,

棧頂的操作符的優先順序大於該操作符的優先順序,則彈出棧頂的操作符,然後將該操作符壓入棧。否則不彈出,並將操作符o壓入棧。

如果該操作符是左括號,那麼將其壓入棧;

如果該操作符是右括號,那麼從棧當中不斷彈出操作符並且放入輸出佇列中,直到棧頂元素為左括號為止。

2、重複執行

3、當再沒有記號可以讀取時:則彈出棧中剩下的操作符。

輸入: 3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3

輸入動作

輸出(逆波蘭表示式)

運算子棧

提示 3

將符號加入輸出佇列

3 +

將符號壓入操作符堆疊3+

4將符號加入輸出佇列

3 4+

*將符號壓入操作符堆疊

3 4*+

*號的優先順序高於+號

2將符號加入輸出佇列

3 4 2

*+ /

將堆疊中元素彈出,加入輸出佇列;

將符號壓入操作符堆疊

3 4 2 *;

3 4 2 *

/號和*號優先順序相同;

/號的優先順序高於+號

(將符號壓入操作符堆疊

3 4 2 *

( / +

1將符號加入輸出佇列

3 4 2 * 1

( / +

-將符號壓入操作符堆疊

3 4 2 * 1

− ( / +

5將符號加入輸出佇列

3 4 2 * 1 5

− ( / +

)將堆疊中元素彈出,加入輸出佇列;

將堆疊元素彈出

3 4 2 * 1 5 −;

3 4 2 * 1 5 −

( / +

/ +迴圈直到找到(號;

括號匹配結束

^將符號壓入操作符堆疊

3 4 2 * 1 5 −

^ / +

^號的優先順序高於/號

2將符號加入輸出佇列

3 4 2 * 1 5 − 2

^ / +

^將符號壓入操作符堆疊

3 4 2 * 1 5 − 2

^號為從右至左求值

3將符號加入輸出佇列

3 4 2 * 1 5 − 2 3

^ ^ / +

end將棧中所有資料加入輸出佇列

3 4 2 * 1 5 − 2 3 ^ ^ / +

參考於:

介紹乙個人工轉換的方法,假設有乙個中綴表示式a+b*c-(d+e)

1首先將這個中綴表示式的所有運算加括號((a+(b*c))-(d+e))

2然後將所有運算子放到括號後面,這樣就變成了((a(bc)* )+ (de)+ )-

3把所有括號去掉abc*+de+-,最後得出的結果就是字尾表示式

上面這個方法可以在比如做題分析的時候用人腦的時候使用,接下來介紹用程式實現將中綴轉換成字尾表示式的思路

參考於:

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...

中綴表示式轉字尾表示式

將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...

中綴表示式轉字尾表示式

演算法 1.設定乙個運算子棧 初始時可以將棧頂運算子置為 2.按順序掃瞄中綴表示式,當輸入為運算元時就將其輸出到字尾表示式中 3.當輸入為運算子時,則比較輸入運算子和棧頂運算子的優先順序。若輸入運算子的優先順序高於棧頂運算子的優先順序,則將輸入運算子入棧 否則,棧頂運算子的優先順序高於或等於輸入運算...