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