一、介紹
棧是一種數據先入後出,後入先出的數據結構。
如果圖所示,將數字 10、15、6、9 存入棧後,從棧中取到的數據按順序將會是 9、6、15、10。棧的結構像我們生活中的箱子,最先放入的物品將會在箱子的最底部,最後放入的數據在最上面,拿物品時也需要從最上面拿起。
二、代碼實現
1、創建 MyStack 類作爲自定義的棧
public class MyStack {
}
2、聲明所需的屬性
底層使用數組存儲數據,也可以使用java的泛型替代Object類型。
private Object[] arr;//存儲數據
private int top;//棧頂的位置
棧頂:整個棧最上面(最後入棧)的元素,也就是數組中最後存入的元素。
棧底:整個棧最下面(最先入棧)的元素,也就是數組中最先存入的元素。
3、棧的構造方法
public MyStack(){
arr = new Object[10];
top = -1;
}
/**
* 參數爲數組的初始長度
* @param maxSize
*/
public MyStack(int maxSize){
arr = new Object[maxSize];
top = -1;
}
4、向棧中壓入數據
底層的操作就是向數組中存入數據,由於top
變量記棧頂的位置,所以top
的值增加1後即爲最新的棧頂的置。
public void push(Object value) {
arr[++top] = value;
}
5、彈出棧頂的數據
取得棧頂的數據,並將此數據將棧中移除。向棧中壓入數據需要將記錄棧頂的位置的變量top
加1,同理,移除棧頂數據需要將top
減1。
public Object pop(){
return arr[top--];
}
6、查看棧頂數據
public Object peek(){
return arr[top];
}
7、判斷是否爲空
public boolean isEmpty(){
return top == -1;
}
8、判斷是否存滿
top
的值等於數組最後一個元素的位置即爲存滿
public boolean isFull(){
return top == arr.length-1;
}
9、完整代碼
public class MyStack {
private Object[] arr;//存儲數據
private int top;//棧頂的位置
public MyStack() {
arr = new Object[10];
top = -1;
}
/**
* 參數爲數組的初始長度
*
* @param maxSize
*/
public MyStack(int maxSize) {
arr = new Object[maxSize];
top = -1;
}
public void push(Object value) {
arr[++top] = value;
}
/**
* 彈出棧頂的數據
* @return
*/
public Object pop(){
return arr[top--];
}
public Object peek(){
return arr[top];
}
public boolean isEmpty(){
return top == -1;
}
public boolean isFull(){
return top == arr.length-1;
}
}
三、驗證
public static void main(String[] args) {
MyStack stack = new MyStack(4);
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
System.out.println("是否爲空:" + stack.isEmpty());
System.out.println("是否存滿:" + stack.isFull());
System.out.println("棧頂:"+stack.peek());
System.out.println("棧頂:"+stack.peek());
//彈出棧中所有數據
while (!stack.isEmpty()){
System.out.println(stack.pop());
}
System.out.println("是否爲空:" + stack.isEmpty());
System.out.println("是否存滿:" + stack.isFull());
}