2010-06-15 52 views
3

目前我唯一知道的唯一一個堆棧是Vector,我通常使用它來代替數組,但我知道還有其他類型的堆棧,它們都適合不同的作業。Java和不同類型的堆棧

我目前正在處理的項目要求我將對象插入堆棧中的某個位置,而不總是堆棧的前面,我的印象是Vector可能不是這個工作的最佳類。

有人請給我一個關於Java語言可用的其他類型堆棧的簡要描述,以及它們的優點和缺點嗎?這些名稱是同質的嗎?例如。它們僅用於Java語言還是用作計算機科學中的一般術語?

謝謝

回答

3

你提到你正在把東西插入到你的'堆棧'的中間。那麼我會推薦使用LinkedList

如果您已經找到需要輸入新元素的位置,則插入它的時間爲O(1)。對於一個矢量,它是O(n),因爲你需要複製支持數組。

LinkedList也支持類似堆棧的操作,如添加到結尾或彈出堆棧的結尾。

查看數據結構的javadocs以查看它提供的功能。

回答你最後一個問題。 LinkedList是整個計算機科學中非常普遍的數據結構。它也常用於實現堆棧,因爲推入和彈出操作是恆定時間,O(1)

+0

鏈表是一個相當內存效率低下的數據結構,通常不是堆棧的最佳實現;基於陣列的列表也提供了分期的O(1)push和pop。 – 2010-06-15 17:50:32

+0

@Michael,但插入任何數組支持的結構的中間無論如何都會導致性能較差(O(n))。 – jjnguy 2010-06-15 17:53:40

+0

@jinguy:是的,但他們提供O(1)隨機訪問。如果你同時需要(通常是這種情況),那麼這些相互抵消,並且內存效率使基於陣列的實現成爲更好的選擇。只有在迭代期間經常需要添加/刪除並且不需要隨機訪問時,鏈接列表纔是一個不錯的選擇。 – 2010-06-15 17:57:55

1

java.util.Stack的API文檔建議您使用接口java.util.Deque的其中一個實現,例如java.util.ArrayDequejava.util.LinkedList

A LinkedList對於在中間插入元素並從頭部或尾部移除元素(但查找隨機元素效率低)是有效的。

3
  • 是一個抽象的數據類型,其特徵在於LIFO行爲或推/彈出操作
  • 列表是一個抽象的數據類型,其特徵在於具有通過數字索引可訪問的其elemets。
  • 一種陣列是一個列表
  • java.util.List的低級實現表示爲一個Java接口
  • java.util.Deque是一個Java接口,同時提供LIFO和FIFO隊列行爲(列表類型並因此將堆棧行爲作爲子集)
  • java.util.Vector是不應該再使用的列表(基於自動調整大小的數組)的過時實現
  • java.util.ArrayList是其現代化的替代
  • java.util.Stack是一種過時的實施堆棧包括添加一些堆垛狀方法的載體,是不要做的好辦法的。
  • java.util.ArrayDeque是一個現代化的實現雙端隊列接口的
  • java.util.LinkedList是不同的實現列表(也實現雙端隊列接口)有一些大的缺點,只應在非常特殊的使用案例(當你需要經常插入或刪除列表中的元素時更好)。

基本上,如果你想有一個堆棧,使用Deque接口和ArrayDeque爲實現類(除了在罕見的情況下LinkedList是更好)。如果你想要一個列表,使用ArrayList

+0

他指定他會經常插入「堆棧」的中間。 – jjnguy 2010-06-15 17:49:53

+1

我不認爲'堆棧'是實際需要的數據結構。 (純粹意義上的堆棧只允許訪問最近添加的元素) – jjnguy 2010-06-15 17:51:13

+0

注意Vector和Stack已經過時,因爲所有的操作都是同步的。較新的實現不同步,並且由用戶根據需要進行同步,或者使用同步的包裝類來包裝列表(請參見java.util.Collections.synchronizedList())。 – AngerClown 2010-06-15 17:55:17