棧的應用計算器(實現多位數字的運算)

2021-10-09 22:23:43 字數 2894 閱讀 2588

package stack;

/*思路分析

1. 通過乙個 index 值(索引),來遍歷我們的表示式

2. 如果我們發現是乙個數字, 就直接入數棧

3. 如果發現掃瞄到是乙個符號, 就分如下情況

3.1 如果發現當前的符號棧為 空,就直接入棧

3.2 如果符號棧有操作符,就進行比較,

如果當前的操作符的優先順序小於或者等於棧中的操作符,

就需要從數棧中pop出兩個數,在從符號棧中pop出乙個符號,進行運算,將得到結果,入數棧,然後將當前的操作符入符號棧,

如果當前的操作符的優先順序大於棧中的操作符, 就直接入符號棧.

4. 當表示式掃瞄完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,並執行.

5. 最後在數棧只有乙個數字,就是表示式的結果

(1)如何判斷是否為數字?

判斷其對立面,是否是符號,因為符號就四個,便於判斷

(2)peek的作用?

當前的操作符的優先順序小於或者等於棧中的操作符,進行運算,需要比較優先順序大小,但是並不需要取出來

所以增加了peek函式

(3)當前的操作符的優先順序小於或者等於棧中的操作符 就進行計算操作?

根據運算子優先順序的順序,先加減後乘除,所以優先順序小於或者等於棧頂的元素,即就需要計算

(4)如何保證多位數字的計算?

在處理數,需要向expression的表示式的index 後再看一位,如果是數就進行掃瞄,如果是符號才入棧

引入keepnum作為儲存多位數字的變數

(5)表示式掃瞄完畢,為什麼又一次while迴圈

operstack存放oper的棧中可能還有符號,並沒有完全計算完畢,所以將剩餘的未計算的結果計算完

符號棧為空,則計算到最後的結果, 數棧中只有乙個數字

(6)index的作用?

index用於掃瞄,

比如表示式掃瞄完畢,index記錄當前已經掃瞄多少個元素,可以根據index與表示式長度的比較,判斷是否掃瞄結束。

當前掃瞄到第幾個元素

*/public

class

calculatortest

else

//如果棧中為空,直接push進去

}else

}//掃瞄到的符號是數字

else

else}}

//index++讀取下乙個

index++

;//判斷是否掃瞄完畢,掃瞄完畢之後可以退出while迴圈

if(index >= expression.

length()

)}/* 表示式掃瞄完畢,可能扔未計算完畢,將剩餘棧中的數字計算*/

while

(true

) num1 = numstack.

pop();

num2 = numstack.

pop();

oper = operstack.

pop();

res = numstack.

cal(num1, num2, oper)

; numstack.

push

(res)

;//入棧

}int res2 = numstack.

pop();

system.out.

printf

("表示式 %s = %d"

, expression, res2);}

}class

arraystack3

//棧滿

public

boolean

isfull()

//棧空

public

boolean

isempty()

//入棧-push

public

void

push

(int value)

top++

; stack[top]

= value;

}//出棧-pop, 將棧頂的資料返回

public

intpop()

int value = stack[top]

; top--

;return value;

}//顯示棧的情況[遍歷棧], 遍歷時,需要從棧頂開始顯示資料

public

void

list()

/* system.out.printf("棧中元素為:");

for(int i = top ; top >= 0 ;top--)

system.out.println();*/

for(

int i = top; i >=

0; i--)}

/*需要增加新的功能*/

//返回運算子的優先順序,優先順序是程式設計師來確定, 優先順序使用數字表示

//數字越大,則優先順序就越高.

public

intpriority

(int oper)

else

if(oper ==

'+'|| oper ==

'-')

else

}//判斷是不是乙個運算子

public

boolean

isoper

(char val)

//計算 注意順序

public

intcal

(int num1 ,

int num2 ,

int oper)

return res;

}//增加乙個方法,可以返回當前棧頂的值, 但是不是真正的pop

public

intpeek()

}

棧的應用 計算器實現四則運算

學習乙個知識點並不是那麼難,而要運用所學的知識點去實現乙個功能或者做乙個專案卻總不是那麼簡單。就像這個標題,如何用棧來做出乙個計算器呢?我們先來思考一番,比如有個式子 9 3 1 3 10 2 遇到這個式子我們可能一氣呵成就能寫出答案是20,因為我們從小學就開始學習數學然後計算,我們太習慣了去做這件...

c 資料結構 棧的應用 計算器

新年第一次發,這幾天在複習期末考試。但是好像已經複習完了但是還有十天多才考試感覺挺無聊的就寫個計算器。但是 太難看。裡一堆的if else。我還是學好catch throw吧!先貼出來。看看再修修補補,好好弄弄結構。買了明晚星戰的票。那今晚要不要出去high呢。pragma once ifndef ...

棧的應用 計算器 加,減,乘,除,括號

最初接觸此類的題目,是只涉及到的加減乘除四則運算,沒有符號的操作,因為在一次筆試中遇到了有括號的情況,抱著遇到問題一定要去解決的態度,筆試結束後嘗試將這道題目進行還原。這裡的思想主要是用到了棧,分為兩個棧,乙個棧存放數字,另外乙個棧存放運算子和括號 include include using nam...