/**
* 使用棧完成表示式的計算思路
* * 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 說...