使用棧完成算術表示式的計算

2021-10-17 09:05:09 字數 2240 閱讀 4159

需要兩個棧來分別儲存我們的操作符和數字

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

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

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

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

3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符, 就需要從數棧中pop出兩個數,在從符號棧中pop出乙個符號,進行運算,將得到結果,入數棧,然後將當前的操作符入符號棧, 如果當前的操作符的優先順序大於棧中的操作符, 就直接入符號棧.

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

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

public

class

calculator

} numstack.

push

(integer.

parseint

(keepnum));

//注意字元數字轉換

keepnum ="";

}else

else

else}}

index++;if

(index >= expression.

length()

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

while

(true

) num1 = numstack.

pop();

num2 = numstack.

pop();

oper = operstack.

pop();

res = numstack.

cal(num1, num2, oper)

; numstack.

push

(res)

;//入棧

}//將數棧的最後數,pop出,就是結果

int res2 = numstack.

pop();

system.out.

printf

("表示式 %s = %d"

, expression, res2);}

}//先建立乙個棧,直接使用前面建立好

//定義乙個 arraystack2 表示棧, 需要擴充套件功能

class

arraystack2

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

public

intpeek()

//棧滿

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()

//需要從棧頂開始顯示資料

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;

}}

使用棧完成算術表示式的計算

基本思路 為了完成算術表示式的計算,用到了兩個棧,乙個用於存放運算元,另乙個用於存放操作符。假設 程式中定義了兩個棧 operandstack 用來存放運算元 operatorstack 用於存放操作符 在處理運算元和操作符之前,首先將它們壓入棧中。當要處理乙個操作符時,從operatorstack...

使用棧完成表示式的計算

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

使用棧來計算算術表示式

之所以寫這個,是因為最近在學習c 的過程中,c primer 第五版 9.6的習題跟這個有關,在網上看看些人的思路,也就做出來了,正好寫到部落格裡面。原題如下 使用 stack 處理括號化的表示式。當你看到乙個左括號,將其記錄下來。當你在乙個左括號之後看到乙個右括號,從 stack 中 pop 物件...