常規表示式轉化為字尾表示式的兩種方法

2021-09-12 10:34:27 字數 818 閱讀 4182

用棧對表示式求值就要想到字首表示式和字尾表示式了,字尾表示式方便一些。棧由於先進後出和後進先出的原則,所以字尾表示式求值的演算法思路簡單是:讀取字尾表示式,遇到運算元就進棧,遇到操作符的時候,先從棧中連續取出兩個運算元,計算出值然後結果進棧。

那麼問題來了,怎麼將常規表示式轉化成字尾表示式?

a*b+(c-d/e)*f為例

方法一:

1,遇到運算元直接輸出到字尾表示式

2,遇到操作符

(1)沒遇到括號時,如果當前操作符優先順序高於棧頂(棧頂預設為#,優先順序小於一切),則直接進棧。如果當前優先順序小於或等於棧頂,則棧頂元素輸出到字尾表示式,一直到當前優先順序高於棧頂時停止

(2)遇到括號的情況,先遇到左括號時,不用管,直接放進棧,然後一切照舊,最後遇到右括號時,將左括號後的操作符依次輸出到字尾表示式,左括號也彈出但是不輸出到表示式

(3)最後乙個運算元也輸出後,將棧內的剩餘操作符依次輸出 

a*b+(c-d/e)*f:輸出a,*進棧,b輸出,+優先順序低於*,*輸出,+進棧,(進棧,c輸出,-進棧,d輸出,/優先順序高於-,/進棧,e輸出,遇到右括號輸出/輸出-彈出(,*優先順序大於+,*進棧,輸出f,輸出*,輸出+,得到ab*cde/-f*+

方法二

加括號,將表示式中的小式子都加上括號,讓每個操作符都能匹配乙個括號,再將操作符移到對應括號右邊,最後去掉括號

a*b+(c-d/e)*f:

加括號後得((a*b)+((c-(d/e))*f)),右移操作符得((ab)*((c(de)/)-f)*)+,去掉括號得ab*cde/-f*+

中綴表示式轉化為字尾表示式

注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法 給出下面乙個例子 我們把中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 1.首先初始化乙個空棧,用來對符號進出棧使用 2.第乙個字元是數字9,輸出9,將後面的符號 進棧 ...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...