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

2021-10-08 07:45:46 字數 2321 閱讀 9131

棧: 計算器–運算

思路:自己定義符號優先順序 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用於讀取傳...