java 如何實現棧

棧的定義

  • 棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧頂(top),有的稱爲限定性的限制表結構。棧有時也叫做 LIFO (後進先出)表。
    網上找的圖片

數組實現棧

  • 使用數組實現棧

優點:一個元素佔用一個存儲空間;
缺點:如果初始化申請的存儲空間太大,浪費存儲空間。如果申請的存儲空間太小,如果後期需要擴充空間,擴充是一個費時的操作,這樣會造成性能的下降。

  • 時間複雜度爲 O(1)

  • 代碼如下:


/**
 * 數組方式實現棧
 */
public class MyStack<T> {
    // 定義數組存放數據
    private ArrayList<T> arr;
    // 定義棧的大小
    private int stackSize;

    public MyStack() {
        arr = new ArrayList<>();
        stackSize = 0;
    }

    /**
     * 判斷是否是null
     */
    boolean isEmpty() {
        return stackSize == 0;
    }

    /**
     * 獲取棧大小
     */
    int size() {
        return stackSize;
    }

    /**
     * 獲取棧頂元素
     */
    T top() {
        if (isEmpty()) {
            return null;
        }
        return arr.get(stackSize - 1);
    }

    /**
     * 彈棧
     */
    T pop() {
        if (stackSize > 0) {
            return arr.get(--stackSize);
        } else {
            System.out.println("棧爲null");
            return null;
        }
    }

    /**
     * 壓棧
     */
    void push(T item){
        stackSize++;
        arr.add(item);
    }

}
  • 調用如下:
    @Test
    public void test() {
        MyStack<Integer> myStack = new MyStack<>();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println("棧頂元素爲:" + myStack.top());
        System.out.println("棧大小爲:" + myStack.size());
        myStack.pop();
        System.out.println("彈棧成功");
        System.out.println("棧大小爲:" + myStack.size());
        System.out.println("棧頂元素爲:" + myStack.top());
    }

鏈表實現棧

  • 優缺點

優點:使用靈活方便,只有在需要的時候才申請存儲空間。
缺點:除了要存儲元素外,還要額外的存儲指針信息。

  • 時間複雜度爲 O(1)

  • 棧實現如下:


/**
 * 鏈表方式實現棧
 */
public class MyStack2<T> {

    static class LNode<T> {
        T data;
        LNode<T> next;
    }

    private LNode<T> head;

    public MyStack2() {
        head = new LNode<T>();
        head.data = null;
        head.next = null;
    }

    /**
     * 棧是否爲null
     */
    boolean empty() {
        return head == null;
    }

    /**
     * 大小
     */
    int size() {
        int size = 0;
        LNode<T> node = head.next;
        while (node != null) {
            node = node.next;
            size++;
        }
        return size;
    }

    T top() {
        if (head == null || head.next == null) {
            return null;
        }
        return head.next.data;
    }

    T pop() {
        LNode<T> tmp = head.next;
        if (tmp != null) {
            head.next = tmp.next;
            return tmp.data;
        }
        System.out.println("棧爲null");
        return null;
    }

    void push(T item) {
        LNode<T> addItem = new LNode<>();
        addItem.data = item;
        addItem.next = head.next;
        head.next = addItem;
    }

}

  • 調用如下:

    @Test
    public void test2() {
        MyStack2<Integer> myStack = new MyStack2<>();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println("棧頂元素爲:" + myStack.top());
        System.out.println("棧大小爲:" + myStack.size());
        myStack.pop();
        System.out.println("彈棧成功");
        System.out.println("棧大小爲:" + myStack.size());
        System.out.println("棧頂元素爲:" + myStack.top());
    }

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