先進後出的數據結構,入棧,出棧 , 定義一個指針始終指向棧頂,沒有數據時爲-1
1.使用數組模擬實現棧-定義結構
class ArrayStack {
private int MaxSize; //表示棧的最大空間
private int[] array; //表示存放數據的數組
private int top = -1; //表示棧頂,起始位置爲-1表示無數據
public ArrayStack(int maxSize) { 初始化棧
MaxSize = maxSize;
array = new int[maxSize];
}}
2.棧的方法
1.有數據時 top從0開始 所以 top=maxSize -1 時爲滿 2.top=-1時爲空
3.入棧時,將top上移,然後將數據添加到top指向位置 4.出棧時 將top下移,數據並沒有真實出棧,只是top指向棧頂數據變化
5.遍歷棧時, 從棧頂開始遍歷
public Boolean isFull() { 當棧頂爲最大空間-1時滿,因爲top從0開始
return top == MaxSize - 1;
}
public Boolean isEmpty() { 當top=-1時,棧爲空
return top == -1;
}
添加一個數據, 入棧
public void push(int num) {
if (isFull()) {
System.out.println("棧爲滿,不能添加~~");
return;
}
top++;
array[top] = num; }
* 彈出棧頂數據, 出棧
public int pop() {
if (isEmpty()) {
throw new RuntimeException("棧爲空,不能出棧~!");
}
int value = array[top];
top--;
return value; }
二.中綴表達式與棧實現 簡單計算器
1.前綴表達式 (3+4)×5-6 對應的前綴表達式就是 - × + 3 4 5 6
.從右往左掃描表達式 遇到數字入棧 ,遇到符號 彈出 倆個數字 number1 number2 使用 number1 運算符 number2
2.中綴表達式 中綴表達式就是常見的運算表達式,如(3+4)×5-6 人們常用計算方法
3.後綴表達式 (3+4)×5-6 對應的後綴表達式就是 3 4 + 5 × 6 –
.從左往右掃描表達式 遇到數字入棧 ,遇到符號 彈出 倆個數字 number1 number2 使用 number2 運算符 number1
2.中綴表達式計算 大致思路
1.準備兩個棧 1. 存放數據棧 2.存放符號棧
2.若果是符號: 1.如果符號棧爲空 或者 當前符號優先級大於 棧頂符號的優先級 則直接入棧
2.如果 當前符號優先級小於 棧頂符號的優先級 則取出數據棧兩個數字 num1, num2 取出一個運算符
做運 算 num2 運算符 num1, 得到運算結果入數據棧, 並將新符號入棧
3.最後 掃描完成,依次 取出兩個數據 一個運算符 做運算,將結果入棧
留在數據棧中的數字就爲最後計算結果
列如表達式 expression = "3+2*3-1";
1.第一次掃描 數據棧 爲3 ,2,3 符號棧爲+ ,* 2.掃描到-時, 優先級小於* 取出數據棧兩個數字運算得到6 然後入棧
3.數據棧 爲3,6 ,1 符號棧爲+ ,-
5.依次 取出兩個數據 一個運算符 做運算,將結果入棧 6.最後數據棧數字爲8
三.後綴表達式與棧實現 簡單計算器
1.後綴表達式更適合計算器計算, 而中綴表達式更適合人類計算 後綴表達式也叫 逆波蘭表達式
2.如下: 中綴表達式 (30+4)*5-6 轉換爲後綴 "30 4 + 5 * 6 -" 並將每個字符放入集合 [3, 4, +, 5, *, 6, -]
public List<String> getArrayList(String expression) {
List<String> expresList = new ArrayList<>();
String[] s = expression.split(" ");
for (String s1 : s) {
expresList.add(s1);
}
return expresList; }
3.遍歷 [3, 4, +, 5, *, 6, -] 計算, 使用java 提供的 棧
1.如果是數字直接入棧 2.如果是符號 取出棧中兩個數字 與當前符號計算 並將結果入棧 3.最終棧中留下一個數字爲結果
private int Calculator(List<String> arrayList) {
Stack<String> stack = new Stack<>();
for (String item : arrayList) {
if (item.matches("\\d+")){
stack.push(item);
}else {
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
int res= 0;
if (item.equals("+")){
res=num2+num1;
}else if (item.equals("-")){
res=num2-num1;
}else if (item.equals("*")){
res=num2*num1;
}else if (item.equals("/")){
res=num2/num1;
}else {
throw new RuntimeException("符號錯誤!");
}
stack.push(res+"");
}}
return Integer.parseInt(stack.pop()); } 29