演算法 簡易綜合計算器(字尾表示式)棧

2021-10-04 23:10:21 字數 2052 閱讀 9654

初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

從左至右掃瞄中綴表示式;

遇到運算元時,將其壓s2;

遇到運算子時,比較其與s1棧頂運算子的優先順序:

如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

否則,若優先順序比棧頂運算子的高,也將運算子壓入s1;

否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4.1)與s1中新的棧頂運算子相比較;

遇到括號時:

如果是左括號「(」,則直接壓入s1

如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄

重複步驟2至5,直到表示式的最右邊

將s1中剩餘的運算子依次彈出並壓入s2

依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式

public

class

polandnotation

//方法:將 中綴表示式轉成對應的list

public

static list

toinfixexpressionlist

(string s)

else

ls.add(str);}

}while

(i < s.

length()

);return ls;

}//[1,+,(,(,2,+,3,),*,4,),-,5] => [1,2,3,+,4,*,+,5,–]

//方法:將得到的中綴表示式對應的list => 字尾表示式對應的list

public

static list

parsesuffixexpreesionlist

(list

ls)elseif(

"(".

equals

(item)

)elseif(

")".

equals

(item)

) s1.

pop();

//將 ( 彈出 s1棧, 消除小括號!!!

}else

s1.push

(item)

;//還需要將item壓入棧}}

while

(s1.

size()

!=0)return s2;

//注意因為是存放到list, 因此按順序輸出就是對應的字尾表示式對應的list

}//將乙個逆波蘭表示式, 依次將資料和運算子 放入到 arraylist中

public

static list

getliststring

(string suffixexpression)

return list;

}//完成對逆波蘭表示式的運算

public

static

intcalculate

(list

ls)else

else

if(item.

equals

("-"))

else

if(item.

equals

("*"))

else

if(item.

equals

("/"))

else

stack.

push(""

+ res)

;//把res 入棧}}

return integer.

parseint

(stack.

pop())

;//最後留在stack中的資料是運算結果}}

//類 operation 可以返回乙個運算子 對應的優先順序

class

operation

return result;

}}

演算法 簡易綜合計算器(中綴表示式)棧

使用棧完成表示式的計算 思路 通過乙個 index 值 索引 來遍歷我們的表示式 如果我們發現是乙個數字,就直接入數棧 如果發現掃瞄到是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為 空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,...

棧實現綜合計算器(中綴表示式)

定義兩個棧,乙個數字棧 numstack 乙個符號棧 operstack 我們定義乙個index來遍歷我們的表示式 定義乙個keepstring key幫助我們拼串 如果發現key是乙個數字,此時判斷key 的下乙個元素是不是數字,繼續向後遍歷,直到key的下乙個元素不是數字時,將integer.p...

棧實現綜合計算器(中綴表示式)

1.通過乙個index值 索引 來遍歷我們的表示式 2.如果發現是乙個數字,直接入棧 3.如果發現掃瞄到的是乙個符號,就分下面情況 1 如果發現當前的符號棧為空,就直接入棧 2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,就需要從數棧中pop出兩個數,再從符號...