Java棧 Stack的底層實現

Java 棧


在leetcode遇到一個問題,給一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。解題的時候用到了棧的方法,查了一些資料,順便學習一下,記錄一下。

先看一下代碼

public class IsValid {
    public static void main(String[] args) {
        String a = "()";
        boolean valid = isValid(a);
        System.out.println(valid);
    }
  public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(')');
            } else if (c == '[') {
                stack.push(']');
            } else if (c == '{') {
                stack.push('}');
            } else if (stack.isEmpty() || c != stack.pop()) {
                return false;
            }
        }
        return stack.isEmpty();
    }
}

這裏用到了Java 棧 類的 stack.push()方法
棧是Vector的一個子類,它實現了一個標準的後進先出的棧。
堆棧只定義了默認構造函數,用來創建一個空棧。 堆棧除了包括由Vector定義的所有方法,也定義了自己的一些方法。

Stack() 菜鳥教程

序號 方法描述
1 boolean empty() 堆棧是否爲空。
2 Object peek( ) 堆棧頂部的對象,但不從堆棧中移除它。
3 Object pop( ) 移除堆棧頂部的對象,並作爲此函數的值返回該對象。
4 Object push(Object element) 把項壓入堆棧頂部。
5 int search(Object element)返回對象在堆棧中的位置,以 1 爲基數。

在這裏插入圖片描述
看一下 Stack的底層源碼:

public class Stack {
    /**
     * 所述Stack類表示對象的後進先出(LIFO)堆棧。
     * 它擴展類Vector有五個操作,它允許載體來作爲堆棧進行處理。
     * 通常的push和pop提供業務,以及在堆棧頂部的項目,測試方法爲堆棧是否爲空 ,
     * 和方法來偷看的方法來搜索堆棧中的項目和發現多遠從頂部。
     * 首次創建堆棧,它不包含的項目。
     * LIFO堆棧操作的更完整和一致的集合由提供Deque接口及其實現方式,應優先使用此類
     */
    public class Stack<E> extends Vector<E> {
        /**
         * 創建一個空Stack
         */
        public Stack() {
        }

        /**
         * 把項壓入該堆棧的頂部。 這有完全相同的效果:
        */
        public E push(E item) {
            addElement(item);

            return item;
        }

        /**
         * 刪除對象在該堆疊的頂部並返回該對象作爲該函數的值。
         *
         * @return 在這個堆棧頂部的對象(Vector對象的最後一項)
         */
        public synchronized E pop() {
            E obj;
            int len = size();

            obj = peek();
            removeElementAt(len - 1);

            return obj;
        }

        /**
         * 返回棧頂元素,不執行刪除操作
         *
         * @return
         */
        public synchronized E peek() {
            int len = size();

            if (len == 0)
                throw new EmptyStackException();
            return elementAt(len - 1);
        }

        /**
         * 棧是否爲空.
         */
        public boolean empty() {
            return size() == 0;
        }

        /**
         * 返回基於1的位置處的對象在棧上。
         * 如果對象o如在此堆棧的項目,則此方法返回從最靠近疊層的頂部發生的堆棧的頂部的距離;
         * 堆棧上的最上面的項目被認爲是在距離1。
         * equals方法來比較Ø在這個堆棧的項目。
         *
         * @return 從該對象位於堆棧頂部的基於1的位置; 返回值-1表示該對象不是在堆棧中
         */
        public synchronized int search(Object o) {
            int i = lastIndexOf(o);

            if (i >= 0) {
                return size() - i;
            }
            return -1;
        }

        private static final long serialVersionUID = 1224463164541339165L;
    }

Stack.Peek 與 stack.pop 的區別

相同點:都返回棧頂的值。
不同點peek 不改變棧的值(不刪除棧頂的值),pop會把棧頂的值刪除。

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