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.當輸入為運算子時,則比較輸入運算子和棧頂運算子的優先順序。若輸入運算子的優先順序高於棧頂運算子的優先順序,則將輸入運算子入棧 否則,棧頂運算子的優先順序高於或等於輸入運算...