中序表示式轉字尾表示式

2021-08-18 16:44:24 字數 1371 閱讀 2887

(3 + 4) × 5 - 6

這種寫法是中序表示式

而後序表示式則是將運算子放在運算元的後面,如

3 4 + 5 × 6 -

可以看出後序表示式中沒有括號, 只表達了計算的順序, 而這個順序恰好就是計算器中的一般計算順序。

建立乙個棧s 。從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如果讀到n元運算子(即需要引數個數為n的運算子)則取出由棧頂向下的n項按操作符運算,再將運算的結果代替原棧頂的n項,壓入棧s中 。如果字尾表示式未讀完,則重複上面過程,最後輸出棧頂的數值則為結束。

例 : 6 5 2 3 + 8 * + 3 + *

由於後續表示式更易計算機去解決,所以我們在運算算術表示式時要先轉換為後序的。方法如下

建立符號棧

順序掃瞄中序表示式 

a) 是數字, 直接輸出 

b) 是運算子 

i : 「(」 直接入棧 

ii : 「)」 將符號棧中的元素依次出棧並輸出, 直到 「(「, 「(「只出棧, 不輸出 

iii: 其他符號, 將符號棧中的元素依次出棧並輸出, 直到 遇到比當前符號優先順序更低的符號或者」(「。 將當前符號入棧。

掃瞄完後, 將棧中剩餘符號依次輸出

例 : 3+(2-5)*6/3

表示式 : 3 

符號棧 :

表示式 : 3 

符號棧 : +

表示式 : 3 

符號棧 : + (

表示式 : 3 2 

符號棧 : + (

表示式 : 3 2 

符號棧 : + ( -

表示式 : 3 2 5 

符號棧 : + ( -

表示式 : 3 2 5 - 

符號棧 : +

表示式 : 3 2 5 - 6 

符號棧 : + *

表示式 : 3 2 5 - 6 * 

符號棧 : + /

表示式 : 3 2 5 - 6 * 3 

符號棧 : + /

表示式 : 3 2 5 - 6 * 3 / +

中序表示式轉後序表示式

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

中綴表示式轉字尾表示式

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棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...