1. 程式人生 > >中綴表示式轉字尾表示式並進行計算 原理

中綴表示式轉字尾表示式並進行計算 原理

在計算一個表示式的時候,可以用資料結構中棧的知識,將我們平常熟悉的中綴表示式轉為字尾表示式,再將字尾表示式進行計算得到結果。先說下什麼是中綴什麼是字尾:

中綴表示式: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.字尾表示式的計算

先初始化一個棧,這個棧是用來存放運算物件的,然後定義一個變數存放最後的結果。遍歷到數字則依次進棧,遍歷到運算子的時候將棧頂運算子彈出(假設賦給變數a),再將此時的棧頂運算子彈出(假設賦給變數b),用後者對前者做該運算子對應的運算(假設遍歷當前的運算子為+,則做計算b+a),然後將計算結果入棧

。以此方式遍歷整個字串,最終的結果即為運算結果。