數據結構(2):棧的原理和實現

一、介紹

棧是一種數據先入後出,後入先出的數據結構。

image

如果圖所示,將數字 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());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章