在計算乙個表示式的時候,可以用資料結構中棧的知識,將我們平常熟悉的中綴表示式轉為字尾表示式,再將字尾表示式進行計算得到結果。先說下什麼是中綴什麼是字尾:
中綴表示式:eg: 9+(3-1)*3+10/2,就是我們平常計算時的表示式;
字尾表示式:eg: 9 3 1 - 3 * + 10 2 / + ,不包含括號,運算子在兩個運算物件後面的表示式。
1.中綴表示式轉字尾表示式
我們先初始化乙個空的字串(string)和棧(stack),將這個中綴表示式中的數字和運算子(包括加減乘除及左右括號)分割成乙個個字串存進乙個新的陣列中,比如上面的中綴表示式就存為:9 + ( 3 - 1 ) * 3 + 10 / 2 (簡便起見用空格將乙個個字串隔開了…) 然後遍歷這個陣列,運算物件就直接放進剛才初始化的string中,棧中存放的是運算子。如果是空棧,加減乘除或左括號就直接進棧,如果棧不為空,此時掃瞄到的運算子與棧頂運算子做優先順序比較,如果棧頂運算子優先順序低於掃瞄的運算子,則當前掃瞄運算子入棧,否則棧頂運算子彈棧並連線在string後,並與彈棧後的站定運算子再做比較,直到站定運算子低於當前掃瞄的運算子或遇到左括號,並將當前運算子進棧;當前運算子若是右括號,則將棧頂運算子依次彈出並依次連線到string後,直到遇到左括號,並將左括號彈出(但是不連線在string後的,注意字尾表示式中是沒有括號的)。如果中綴表示式遍歷完畢後棧中還有運算子則將棧中剩下的運算子依次彈出並連線在string後面;最終得到的就是字串string字尾表示式。
2.字尾表示式的計算
先初始化乙個棧,這個棧是用來存放運算元的,然後定義乙個變數存放最後的結果。從string中遍歷到數字則依次進棧,遍歷到操作符的時候將棧頂算子彈出(假設賦給變數a,作為右運算元),再將此時的棧頂算子彈出(假設賦給變數b,作為左運算元),用後者對前者做該操作符對應的運算(假設遍歷當前的操作符為+,則做計算b+a),然後將計算結果入棧。以此方式遍歷整個字串string,最終的結果即為運算結果。
中綴表示式轉字尾表示式並進行計算 原理
在計算乙個表示式的時候,可以用資料結構中棧的知識,將我們平常熟悉的中綴表示式轉為字尾表示式,再將字尾表示式進行計算得到結果。先說下什麼是中綴什麼是字尾 中綴表示式 eg 9 3 1 3 10 2,就是我們平常計算時的表示式 字尾表示式 eg 9 3 1 3 10 2 不包含括號,運算子在兩個運算物件...
中綴表示式轉字尾表示式
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棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...