初始化兩個棧:運算子棧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出兩個數,再從符號...