使用棧完成表示式的計算

2021-10-24 02:51:27 字數 2070 閱讀 9382

/**

* 使用棧完成表示式的計算思路

* * 1、通過乙個index值,來遍歷我們的表示式

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

* 3、如果掃瞄到的是乙個符號,就分如下情況

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

* 3.2、如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者

* 等於棧中的操作符,就需要從數棧中pop出乙個符號,進行運算,

* 將得到的結果入數棧,然後將當前的操作符入符號棧,

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

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

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

*/public

class

calculator

else

}else

}else

else}}

//index+1,並判斷是否掃瞄到expression最後

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)

;//入棧

} system.out.

println

("表示式"

+ expression +

"的值為:"

+ numstack.

pop())

;}}

//先建立乙個棧

class

arraystack2

public

arraystack2()

//檢視棧頂的值

public

intpeek()

//棧滿

public

boolean

isfull()

//棧空

public

boolean

isempty()

//入棧

public

void

push

(int value)

top++

; stack[top]

= value;

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

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;

}}

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

需要兩個棧來分別儲存我們的操作符和數字 通過乙個 index 值 索引 來遍歷我們的表示式 如果我們發現是乙個數字,就直接入數棧 如果發現掃瞄到是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為 空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中...

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

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

使用棧完成中綴表示式轉字尾表示式

字尾表示式也稱為逆波蘭表示式。求字尾表示式的過程有很多種,這裡給出利用棧實現的過程。現代編譯器不會直接將算術表示式轉化成機器層的 而是使用乙個中間形式,成為字尾表達法。在字尾表示式中,運算子緊隨在它的運算元的後面,例如,給出中綴表示式a b它的字尾形式就是ab 對於a b c,字尾形式就是abc 說...