【數據結構-Java語言描述】棧

微信公衆號:程序員Alex
關注可瞭解更多的編程知識。問題或建議,請公衆號留言;
如果你覺得文章對你有幫助,歡迎收藏

​ 堆棧(英語:stack)又稱爲堆疊**,是計算機科學中的一種抽象數據類型,只允許在有序的線性數據集合的一端(稱爲堆棧頂端,英語:top)進行加入數據(英語:push)和移除數據(英語:pop)的運算。因而按照後進先出(LIFO, Last In First Out)的原理運作。

棧的實現

  1. 數組實現

  2. 鏈表實現

棧的操作

堆棧使用兩種基本操作:推入(壓棧,push)和彈出(彈棧,pop):

  • 推入:將數據放入堆棧頂端,堆棧頂端移到新放入的數據。
  • 彈出:將堆棧頂端數據移除,堆棧頂端移到移除後的下一筆數據。

棧的特點

堆棧的基本特點:

  1. 先入後出,後入先出。
  2. 除頭尾節點之外,每個元素有一個前驅,一個後繼。

代碼實現

棧的數組實現

public class MyStack<T{
    /**
     * 棧
     */

    private Object[] stack;
    /**
     * 棧的大小
     */

    private int size;
    MyStack() {
        stack = new Object[10];
    }
    private void push(T t) {
        reSize();
        stack[size] = t;
        size++;
    }
    private T pop() {
        T t = peek();
        if (size > 0) {
            size--;
        }
        return t;
    }
    private T peek() {
        T t = null;
        if (size > 0) {
            t = (T) stack[size - 1];
        }
        return t;
    }
    private void reSize() {
        if (stack.length < size + 1) {
            Arrays.copyOf(stack, stack.length * 2);
        }
    }

    /**
     * 判斷棧是否爲空
     *
     * @return
     */

    private boolean isEmpty() {
        return size == 0;
    }
    public static void main(String[] args) {
        MyStack<Integer> stack = new MyStack();
        stack.push(1);
        int t = stack.pop();
        System.out.println(t);
    }
}

棧的鏈表實現

public class MyStack2<T{

    @Data
    class Node<T{
        private T value;
        private Node next;
    }

    private Node stack;

    MyStack2() {
        stack = null;
    }

    /**
     * 獲取棧頂數據
     *
     * @return
     */

    private T peek() {
        T t = null;
        if (Objects.nonNull(stack)) {
            t = (T) stack.value;
        }
        return t;
    }

    private T pop() {
        T t = peek();
        Node newHead = stack.next;
        stack = newHead;
        return t;
    }

    private void push(T t) {
        Node node = new Node();
        node.setValue(t);
        if (isEmpty()) {
            node.setNext(null);
            stack = node;
            return;
        }
        Node temp = stack;
        node.setNext(temp);
        stack = node;
    }

    private Boolean isEmpty() {
        return Objects.isNull(stack);
    }

    public static void main(String[] args) {
        MyStack2<Integer> stack = new MyStack2();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
    }
}

時間複雜度

由於所有操作都是在棧頂,所以pop和posh的時間複雜度都是O(1)

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