棧(Stack)陣列模擬棧
阿新 • • 發佈:2021-01-12
- 棧是一個先入後出的有序列表
- 棧是限制線性表中元素的插入和刪除只能在線性表的同一端進行的一種特殊線性表。允許插入和刪除的一端,為變化的一端,稱為棧頂,另一端為固定的一端,稱為棧底。
- 最先放入棧中的元素在棧底,最後放入的元素在棧頂,而刪除元素剛好相反,最後放入的元素最先被刪除,最先放入的元素最後刪除。
出棧(pop)
入棧(push)
使用陣列模擬棧
1、使用陣列來模擬棧
2、定義一個top來表示棧頂,初始化為-1(此時沒有任何資料,因為陣列第一個元素下標為0);
3、入棧操作,當有資料加入到棧時,top++;
4、出棧操作,先把棧頂的值拿到存入一個變數,top–,返回這個變數;
//定義一個ArrayStack
class ArrayStack{
private int maxSize; //棧的大小
private int[] stack; //陣列,資料放入該陣列中
private int top = -1; //棧頂,初始化為-1,表示沒有資料
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize]; //在構造器中初始化陣列,不然無法儲存資料
}
//判斷棧滿
public boolean isFull() {
return top == maxSize - 1;
}
//判斷棧空
public boolean isEmpty() {
return top == -1;
}
//入棧 -push
public void push(int value) {
//先判斷棧是否滿
if(isFull()) {
System.out.println("棧滿");
return;
}
top++;
stack[top] = value;
}
//出棧-pop,將棧頂的資料返回
//根據陣列型別,選擇返回型別,不一定非是int
public int pop() {
//先判斷是否為空
if(isEmpty()) {
//丟擲異常(代表終止了,不需要return)
//因為這個函式有返回值,如果使用return處理不好處理
throw new RuntimeException("棧空,沒有資料");
}
//首先取得棧頂的值
int temp = stack[top]; //此處的型別根據陣列型別選擇,同返回型別一至
top--;
return temp;
}
//顯示棧的情況【遍歷棧】
public void list() {
if(isEmpty()) {
System.out.println("棧空,沒有資料");
return;
}
//遍歷時候要從棧頂開始
for(int i = top; i >= 0; i--) {
System.out.printf("stack[%d]=%d\n", i , stack[i]);
}
}
}