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

1、介紹

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

image

若是圖所示,將數字 十、1五、六、9 存入棧後,從棧中取到的數據按順序將會是 九、六、1五、10。棧的結構像咱們生活中的箱子,最早放入的物品將會在箱子的最底部,最後放入的數據在最上面,拿物品時也須要從最上面拿起。數組

2、代碼實現

一、建立 MyStack 類做爲自定義的棧

public class MyStack {

}
複製代碼

二、聲明所需的屬性

底層使用數組存儲數據,也可使用java的泛型替代Object類型。數據結構

private Object[] arr;//存儲數據
private int top;//棧頂的位置
複製代碼

棧頂:整個棧最上面(最後入棧)的元素,也就是數組中最後存入的元素。spa

棧底:整個棧最下面(最早入棧)的元素,也就是數組中最早存入的元素。3d

三、棧的構造方法

public MyStack(){
    arr = new Object[10];
    top = -1;
}

/** * 參數爲數組的初始長度 * @param maxSize */
public MyStack(int maxSize){
    arr = new Object[maxSize];
    top = -1;
}
複製代碼

四、向棧中壓入數據

底層的操做就是向數組中存入數據,因爲top變量記棧頂的位置,因此top的值增長1後即爲最新的棧頂的置。code

public void push(Object value) {
    arr[++top] = value;
}
複製代碼

五、彈出棧頂的數據

取得棧頂的數據,並將此數據將棧中移除。向棧中壓入數據須要將記錄棧頂的位置的變量top加1,同理,移除棧頂數據須要將top減1。cdn

public Object pop(){
    return arr[top--];
}
複製代碼

六、查看棧頂數據

public Object peek(){
    return arr[top];
}
複製代碼

七、判斷是否爲空

public boolean isEmpty(){
    return top == -1;
}
複製代碼

八、判斷是否存滿

top的值等於數組最後一個元素的位置即爲存滿blog

public boolean isFull(){
    return top == arr.length-1;
}
複製代碼

九、完整代碼

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;
    }
}
複製代碼

3、驗證

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());
}
複製代碼
相關文章
相關標籤/搜索