中序表示式轉後序表示式

2021-08-19 20:36:03 字數 1198 閱讀 6127

演算法的思想是這樣的:

演算法分為兩個棧,乙個opstack為操作符棧,另一numstack為運算元棧,隨著程式執行運算元棧中里也會有操作符,這是因為小運算元和操作符化作了更大的運算元。如果需要求值,就會將運算元計算出結果,而由於此演算法只是求表示式,所以就保留了操作符。

每一次彈出棧時都會涉及到操作符和運算元的彈出,並且用string的concat方法生成更大的運算元壓入運算元棧,具體的規則如下:

(1). 當運算元棧為空或棧頂為「(」時,壓入操作符

(2). 當遇到新的操作符而操作符棧頂是另乙個操作符時,比較兩個操作符優先順序(後續**中該方法名為priority),如果當前操作符優先順序高於棧頂操作符的,那麼就將操作符壓棧(相當於要程式先得出後面的後序表示式),如果相等或者低於,那麼先彈出上乙個操作符,在完成了運算元操作符合併(後續**中該方法為 emerge)之後再壓入當前操作符。

(3). 如果遇到左括號"(",壓棧

(4). 如果遇到右括號")",彈運算元棧,並進行合併,直到遇到左括號為止(也要將左括號彈出)

(5). 最後,在讀取完所有運算元和操作符後,要將操作符棧中剩餘的操作符全部彈出並進行合併,這樣在numstack中剩下的唯一乙個字串就是所求的後序表示式

注:**中的資料結構arraystack是來自於演算法第4版中的

演算法如下:

public class infixtopostfix 

public static void

emerge(arraystacknumstack,arraystackopstack)

public static void

main(string args)

opstack.push(strs[i]);

} break;

} case

"(":

case

")":

default:}}

while (!opstack.isempty()) emerge(numstack,opstack);

system.out.println(numstack.pop());

}}

輸入:( 8 - 4 ) * 6 - 3 / ( 6 / 2 + 3 - ( 5 * 8 ) )

輸出:8 4 - 6 * 3 6 2 / 3 + 5 8 * - / -

前序表示式 中序表示式 後序表示式

執行完成後,先輸出佇列內容,在輸出棧內容,最終結果即是後序表示式 先序表示式 後序表示式 public string infixtopostfix string elements if s.equals continue 碰到 或 運算子 if s.equals s.equals while sta...

棧的應用 中序表示式轉後序表示式

infix a b c d e f g postfix abc de f g 有以下四種情況 運算元 直接輸出 操作符 將棧頂輸出,直到棧頂優先順序小於該操作符,最後把該操作符壓入棧 入棧 將棧中在 之後的操作符全部輸出 include include include include using n...

中序表示式轉字尾表示式

3 4 5 6 這種寫法是中序表示式 而後序表示式則是將運算子放在運算元的後面,如 3 4 5 6 可以看出後序表示式中沒有括號,只表達了計算的順序,而這個順序恰好就是計算器中的一般計算順序。建立乙個棧s 從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如果讀到n元運算子 即需要引數個數為n的運算...