為什么使用Deque而不使用Stack構造棧


Class Stack<E>

  • java.lang.Object

    • 實現的所有接口

      SerializableCloneableIterable<E>Collection<E>List<E>RandomAccess


    public class Stack<E>
    extends Vector<E>
    

    Stack類表示后進先出(LIFO)對象堆棧。它通過五個操作擴展了類Vector ,允許將向量視為堆棧。提供了通常的pushpop操作,以及在堆棧頂部項目中的peek的方法,用於測試堆棧是否為empty的方法,以及用於項目的堆棧的方法以及發現它的距離search是從頂部。

    首次創建堆棧時,它不包含任何項目。

    Deque接口及其實現提供了更完整和一致的LIFO堆棧操作集,應優先使用此類。 例如:

       Deque<Integer> stack = new ArrayDeque<Integer>(); 
    

繼承關系圖👇

由於Vector由於效率問題已經被棄用,因此繼承Vector的Stack也存在效率問題,故不推薦使用。

再一個原因是Deque雙端隊列可以實現多種數據結構,完全可以模擬成棧的結構。Deque上進上出,上進下出,甚至下進上出,非常上流,只有你想不到,沒有我Deque做不到的。

ArrayDeque與LinkList區別:

ArrayDeque:
  • 數組結構
  • 插入元素不能為null
  • 無法確定數據量時,后期擴容會影響效率
LinkList:
  • 鏈表結構
  • 插入元素能為null
  • 無法確定數據量時,有更好表現

Interface Deque<E>

  • 參數類型

    E - 此雙端隊列中保留的元素類型

  • All Superinterfaces:

    Collection<E>Iterable<E>Queue<E>

  • All Known Subinterfaces:

    BlockingDeque<E>

  • 所有已知實現類:

    ArrayDequeConcurrentLinkedDequeLinkedBlockingDequeLinkedList


public interface Deque<E> extends Queue<E>
  • 線性集合,支持兩端插入和移除元素。名稱deque是“雙端隊列”的縮寫,通常發音為“deck”。大多數Deque實現對它們可能包含的元素數量沒有固定限制,但此接口支持容量限制的deques以及沒有固定大小限制的deques。

  • 此接口定義了訪問雙端隊列兩端元素的方法。 提供了插入,移除和檢查元素的方法。 這些方法中的每一種都以兩種形式存在:一種在操作失敗時拋出異常,另一種返回特殊值( nullfalse ,具體取決於操作)。 后一種形式的插入操作專門設計用於容量限制的Deque實現; 在大多數實現中,插入操作不會失敗。

  • 此接口擴展了Queue接口。 當deque用作隊列時,會產生FIFO(先進先出)行為。 元素在雙端隊列的末尾添加並從頭開始刪除。 繼承自Queue接口的方法與Deque方法完全等效,如下表所示:

    Comparison of Queue and Deque methods Queue Method Equivalent Deque Method add(e) addLast(e) offer(e) offerLast(e) remove() removeFirst() poll() pollFirst() element() getFirst() peek() peekFirst()

    • Deques也可以用作LIFO(后進先出)堆棧。 應優先使用此接口,而不是舊版Stack 。 當deque用作堆棧時,元素將從雙端隊列的開頭推出並彈出。 堆棧方法相當於Deque方法,如下表所示:

      Comparison of Stack and Deque methods Stack Method Equivalent Deque Method push(e) addFirst(e) pop() removeFirst() peek() getFirst()

    • 請注意,當deque用作隊列或堆棧時, peek方法同樣有效; 在任何一種情況下,元素都是從雙端隊列的開頭繪制的。

      此界面提供了兩種刪除內部元素的方法, removeFirstOccurrenceremoveLastOccurrence

    • List接口不同,此接口不支持對元素的索引訪問。

      雖然嚴格要求Deque實現禁止插入null元素,但強烈建議他們這樣做。 任何用戶Deque強烈建議實現,也允許null元素采取插入空的能力優勢。 這是因為null被各種方法用作特殊返回值,以指示deque為空。

    Deque實現通常不定義equalshashCode方法的基於元素的版本,而是繼承類Object基於身份的版本。

方法摘要

變量和類型 方法 描述
boolean add(E e) 將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回 true成功時和拋出 IllegalStateException如果當前沒有空間可用的。
boolean addAll(Collection<? extends E> c) 在此雙端隊列的末尾添加指定集合中的所有元素,就像通過在每個 對象上調用 addLast(E)一樣 ,按照集合的迭代器返回它們的順序。
void addFirst(E e) 如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的前面插入指定元素,如果當前沒有可用空間,則拋出 IllegalStateException
void addLast(E e) 如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的末尾插入指定元素,如果當前沒有可用空間,則拋出 IllegalStateException
boolean contains(Object o) 如果此雙端隊列包含指定的元素,則返回 true
Iterator<E> descendingIterator() 以相反的順序返回此雙端隊列中元素的迭代器。
E element() 檢索但不刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。
E getFirst() 檢索但不刪除此雙端隊列的第一個元素。
E getLast() 檢索但不刪除此雙端隊列的最后一個元素。
Iterator<E> iterator() 以適當的順序返回此雙端隊列中元素的迭代器。
boolean offer(E e) 將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回 true在成功和 false如果當前沒有空間可用。
boolean offerFirst(E e) 將指定元素插入此雙端隊列的前面,除非它違反容量限制。
boolean offerLast(E e) 在此雙端隊列的末尾插入指定的元素,除非它違反容量限制。
E peek() 檢索但不移除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回 null
E peekFirst() 檢索但不刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回 null
E peekLast() 檢索但不刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回 null
E poll() 檢索並刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回 null
E pollFirst() 檢索並刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回 null
E pollLast() 檢索並刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回 null
E pop() 從此雙端隊列表示的堆棧中彈出一個元素。
void push(E e) 如果可以在不違反容量限制的情況下立即執行此操作, IllegalStateException到此雙端隊列表示的堆棧(換句話說,在此雙端隊列的頭部),如果當前沒有可用空間則拋出 IllegalStateException
E remove() 檢索並刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。
boolean remove(Object o) 從此雙端隊列中刪除第一次出現的指定元素。
E removeFirst() 檢索並刪除此雙端隊列的第一個元素。
boolean removeFirstOccurrence(Object o) 從此雙端隊列中刪除第一次出現的指定元素。
E removeLast() 檢索並刪除此雙端隊列的最后一個元素。
boolean removeLastOccurrence(Object o) 從此雙端隊列中刪除最后一次出現的指定元素。
int size() 返回此雙端隊列中的元素數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM