棧: 計算器–運算思路:自己定義符號優先順序 priority
判斷是否為符號 isoper
進行運算 cal
需要兩個棧 — 數棧、符號棧
定義需要的相關變數 index、num1、num2、res、oper、ch
分解表示式
判斷當前字元 是 數字 還是 符號
7.1 如果是數字,直接壓入數棧中
7.2 如果是符號
7.2.1 判斷符號棧是否為空
7.2.2 為空: 將符號直接壓入
7.2.3 不為空: 判斷當前符號 與 符號棧棧頂符號的優先順序誰高
7.2.4當前符號優先順序 小於等於 棧頂符號優先順序: 將數棧中的pop出兩個數,符號棧中pop乙個進行運算,運算完後將 res 放入數棧, 然後再將當前符號壓入符號棧中。
7.2.5當前符號優先順序 大於 棧頂符號優先順序: 直接壓入符號棧
7.3 判斷是否分解到表示式末尾
7.4 表示式分解完後,對兩個棧中剩下的資料進行運算: 數棧pop兩個,符號棧pop乙個。
7.5 運算完成的標誌: 符號棧為空
7.6 最後數棧剩下的就是總運算結果
* 陣列模擬棧
*/class
arraystack
/*** 定義優先順序,符號優先順序是我們自己來定義的
* 以數字來表示優先順序高低
*/public
intprioprity
(char oper)
else
if(oper ==
'+'|| oper ==
'-')
else
}/**
* 判斷是否為符號
*/public
boolean
isoper
(char oper)
/** * 數運算
*/public
intcal
(int num1,
int num2,
char oper)
return res;}}
@test
public
void
testoperstack()
else
else}}
else
if(index >= exp.
length()
)}while
(!operstack.
isempty()
) system.out.
println
(numstack.
pop())
;}上面存在問題: 連續使用兩個減: 3-6*2-2 期望:-11 實際: -7
原因: 表示式分解完後,對剩餘資料運算時, 順序必須從符號棧底向上運算
最後處理數棧、符號棧剩餘資料時修改了下:
arraystack t1 =
newarraystack(10
);arraystack t2 =
newarraystack(10
);while
(!numstack.
isempty()
)while
(!operstack.
isempty()
)while
(!t2.
isempty()
) system.out.
println
(t1.
pop())
;
多位數問題: 根據上面的計算一位數的**只要修改 判斷分解出來的是 數字 還是 符號 的 數字那塊邏輯
思路:定義 string keepnum = 「」; // 用於拼接多位數的.
進行數字拼接
最後將 keepnum 重置 !
else
else
// 防止越界
}// 壓入數棧
numstack.
push
(integer.
parseint
(keepnum));
// 記得重置 keepnum
keepnum ="";
}
棧實現綜合計算器(中綴表示式)
定義兩個棧,乙個數字棧 numstack 乙個符號棧 operstack 我們定義乙個index來遍歷我們的表示式 定義乙個keepstring key幫助我們拼串 如果發現key是乙個數字,此時判斷key 的下乙個元素是不是數字,繼續向後遍歷,直到key的下乙個元素不是數字時,將integer.p...
棧實現綜合計算器(中綴表示式)
1.通過乙個index值 索引 來遍歷我們的表示式 2.如果發現是乙個數字,直接入棧 3.如果發現掃瞄到的是乙個符號,就分下面情況 1 如果發現當前的符號棧為空,就直接入棧 2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,就需要從數棧中pop出兩個數,再從符號...
棧 實現綜合計算器(中綴表示式)
棧 stack 棧的實現定義乙個top來表示棧頂,初始化為 1 入棧 當有資料入棧,top stack top data 出棧 value stack top top 綜合計算器的實現 計算器設計思路 含小括號 先定義兩個陣列棧。乙個用於儲存數字,乙個用於儲存運算符號 在定義乙個index用於讀取傳...