日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么使用Deque而不使用Stack构造栈

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么使用Deque而不使用Stack构造栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

Class Stack<E>

  • java.lang.Object

    • java.util.AbstractCollection<E>
      • java.util.AbstractList<E>
        • java.util.Vector<E>
          • java.util.Stack<E>
    • 實現的所有接口

      Serializable?,?Cloneable?,?Iterable<E>?,?Collection<E>?,?List<E>?,?RandomAccess


    public class Stack<E> extends Vector<E>

    Stack類表示后進先出(LIFO)對象堆棧。它通過五個操作擴展了類Vector?,允許將向量視為堆棧。提供了通常的push和pop操作,以及在堆棧頂部項目中的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>

  • 所有已知實現類:

    ArrayDeque?,?ConcurrentLinkedDeque?,?LinkedBlockingDeque?,?LinkedList


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

  • 此接口定義了訪問雙端隊列兩端元素的方法。 提供了插入,移除和檢查元素的方法。 這些方法中的每一種都以兩種形式存在:一種在操作失敗時拋出異常,另一種返回特殊值(?null或false?,具體取決于操作)。 后一種形式的插入操作專門設計用于容量限制的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方法同樣有效; 在任何一種情況下,元素都是從雙端隊列的開頭繪制的。

      此界面提供了兩種刪除內部元素的方法,?removeFirstOccurrence和removeLastOccurrence?。

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

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

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

方法摘要

變量和類型方法描述
booleanadd(E e)將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回?true成功時和拋出?IllegalStateException如果當前沒有空間可用的。
booleanaddAll(Collection<? extends E> c)在此雙端隊列的末尾添加指定集合中的所有元素,就像通過在每個?對象上調用?addLast(E)一樣?,按照集合的迭代器返回它們的順序。
voidaddFirst(E e)如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的前面插入指定元素,如果當前沒有可用空間,則拋出?IllegalStateException?。
voidaddLast(E e)如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的末尾插入指定元素,如果當前沒有可用空間,則拋出?IllegalStateException?。
booleancontains(Object o)如果此雙端隊列包含指定的元素,則返回?true?。
Iterator<E>descendingIterator()以相反的順序返回此雙端隊列中元素的迭代器。
Eelement()檢索但不刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。
EgetFirst()檢索但不刪除此雙端隊列的第一個元素。
EgetLast()檢索但不刪除此雙端隊列的最后一個元素。
Iterator<E>iterator()以適當的順序返回此雙端隊列中元素的迭代器。
booleanoffer(E e)將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回?true在成功和?false如果當前沒有空間可用。
booleanofferFirst(E e)將指定元素插入此雙端隊列的前面,除非它違反容量限制。
booleanofferLast(E e)在此雙端隊列的末尾插入指定的元素,除非它違反容量限制。
Epeek()檢索但不移除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回?null?。
EpeekFirst()檢索但不刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回?null?。
EpeekLast()檢索但不刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回?null?。
Epoll()檢索并刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回?null?。
EpollFirst()檢索并刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回?null?。
EpollLast()檢索并刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回?null?。
Epop()從此雙端隊列表示的堆棧中彈出一個元素。
voidpush(E e)如果可以在不違反容量限制的情況下立即執行此操作,?IllegalStateException到此雙端隊列表示的堆棧(換句話說,在此雙端隊列的頭部),如果當前沒有可用空間則拋出?IllegalStateException?。
Eremove()檢索并刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。
booleanremove(Object o)從此雙端隊列中刪除第一次出現的指定元素。
EremoveFirst()檢索并刪除此雙端隊列的第一個元素。
booleanremoveFirstOccurrence(Object o)從此雙端隊列中刪除第一次出現的指定元素。
EremoveLast()檢索并刪除此雙端隊列的最后一個元素。
booleanremoveLastOccurrence(Object o)從此雙端隊列中刪除最后一次出現的指定元素。
intsize()返回此雙端隊列中的元素數。

參考自https://www.cnblogs.com/code-duck/p/13569388.html?

總結

以上是生活随笔為你收集整理的为什么使用Deque而不使用Stack构造栈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。