中綴表示式轉字尾表示式並進行計算 原理
阿新 • • 發佈:2019-01-31
在計算一個表示式的時候,可以用資料結構中棧的知識,將我們平常熟悉的中綴表示式轉為字尾表示式,再將字尾表示式進行計算得到結果。先說下什麼是中綴什麼是字尾:
中綴表示式: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後,並與彈棧後的站定運算子再做比較,直到站定運算子低於當前掃描的運算子或遇到左括號,並將當前運算子進棧
2.字尾表示式的計算
先初始化一個棧,這個棧是用來存放運算物件的,然後定義一個變數存放最後的結果。遍歷到數字則依次進棧,遍歷到運算子的時候將棧頂運算子彈出(假設賦給變數a),再將此時的棧頂運算子彈出(假設賦給變數b),用後者對前者做該運算子對應的運算(假設遍歷當前的運算子為+,則做計算b+a),然後將計算結果入棧