數據結構-棧 隊列(數組實現棧、隊列、循環隊列)

先進後出,底層就是一個數組。
首先java中的Stack繼承Vector
實例化

Stack stack=new Stack();

寫一個底層原理

public class MyStack1<E> {
    private Object[] stack;
    private int size;

    public MyStack1() {
        stack = new Object[10];
        //初始長度爲10
    }
    public MyStack1(int initSize) {
        stack = new Object[initSize];
        //初始長度爲10
    }
    /**
     * 判斷棧是否爲空
     * */
    public boolean isEmpty() {
        return size == 0;
    }
    /**
     * 返回棧頂的一個元素,但是不進行出棧操作
     * */
    public E peek() {
        if(isEmpty()) {
            return null;
        }
        return (E)stack[size -1];
        //返回棧頂元素
    }
    /**
     * 彈出
     * */
    public E pop() {
        E e = peek();
        //取得棧頂數據
        if(size > 0) {
            //檢查棧中是否有數據
            stack[size - 1] = null;
            //將出棧後的位置置爲空
            size--;
        }
        //將棧中元素個數減一
        return e;
    }
    /**
     * 壓入
     * */
    public E push(E item) {
        ensureCapacity(size + 1);
        stack[size++] = item;
        return item;

    }
    /**
     * 當棧滿的時候,對棧進行擴容
     * */
    private void ensureCapacity(int size) {
        int len = stack.length;
        if(size > len) {
            //數組已滿
            int newLen = 10;
            //每次數組擴充的容量
            stack = Arrays.copyOf(stack, newLen);
        }
    }
    /**
     * 打印出棧中所有的數據
     * */
    public void printStack() {
        System.out.println("開始進行出棧:");
        while(size > 0) {
            System.out.println("出棧:" + pop());
        }
        System.out.println("出棧操作結束!");

    }
}

E代表泛型

隊列

LinkedList類實現了Queue接口

Queue<String> queue = new LinkedList<String>();

簡單實現

public class MyQueue {
    //底層使用數組
    private long[] arr;
    //有效數據的大小
    private int elements;
    //隊頭
    private int front;
    //隊尾
    private int end;

    public MyQueue(){
        arr = new long[10];
        elements =0;
        front =0;
        end = -1;
    }
    public MyQueue(int maxsize){
        arr = new long[maxsize];
        elements =0;
        front =0;
        end = -1;
    }

    public void insert(long value){
        arr[++end] = value;
        elements++;
    }

    public long remove(){
        elements--;
        return arr[front++];
    }
    public long peek(){
        return arr[front];
    }

    public boolean isEmpty(){
        return elements ==0;
    }
    
    public boolean isFull(){
        return elements == arr.length;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章