数据结构:表达式之中缀转后缀
中綴表達式是最常用的算術表達式,運算符在運算數中間,運算需要考慮運算符優先級.
后綴表達式是計算機容易運算的表達式,運算符在運算數后面,從左到右進行運算,無需考慮優先級,運算呈線性結構.
先舉個簡單的轉換例子
2+9/3-5 (前綴)-> 2 9 3 / + 5 - (后綴)
先進行乘除再進行加減
運算規律,運算數位置不變,改變的是運算符位置
可以推棧實現,用堆棧儲存等待中的運算符.
將當前運算符與最后一個等待的運算符比較.
具體轉換方式:
1.從左到右進行遍歷
2.運算數,直接輸出.
3.左括號,直接壓入堆棧,(括號是最高優先級,無需比較)(入棧后優先級降到最低,確保其他符號正常入棧)
4.右括號,(意味著括號已結束)不斷彈出棧頂運算符并輸出直到遇到左括號(彈出但不輸出)
5.運算符,將該運算符與棧頂運算符進行比較,
如果優先級高于棧頂運算符則壓入堆棧(該部分運算還不能進行),
如果優先級低于等于棧頂運算符則將棧頂運算符彈出并輸出,然后比較新的棧頂運算符.
(低于彈出意味著前面部分可以運算,先輸出的一定是高優先級運算符,等于彈出是因為同等優先級,從左到右運算)
直到優先級大于棧頂運算符或者棧空,再將該運算符入棧.
6.如果對象處理完畢,則按順序彈出并輸出棧中所有運算符.
再來解釋一下開始的簡單例子
再來解釋一下開始的簡單例子
帶括號的運算
選取慕課里何欽銘老師的案例
后綴表達式運算步驟:
(以堆棧儲存)
從左到右,遇到運算符就彈出相應的運算數,運算后再把結果入棧.最終結果就是棧頂數的值.
(由于該運算為線性結構,具體運算時是不需要儲存輸出后的運算符,一般是輸出一個運算符就進行一次運算,不像圖中要儲存輸出狀態.)
注意點:
有時候’-’(負號)是單目運算符,則要修改運算數.
遇到其他運算符(如冪運算)也類似.
總結
以上是生活随笔為你收集整理的数据结构:表达式之中缀转后缀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式(13)--------
- 下一篇: 字节新产品「识区APP」上线