目前我唯一知道的唯一一個堆棧是Vector,我通常使用它來代替數組,但我知道還有其他類型的堆棧,它們都適合不同的作業。Java和不同類型的堆棧
我目前正在處理的項目要求我將對象插入堆棧中的某個位置,而不總是堆棧的前面,我的印象是Vector可能不是這個工作的最佳類。
有人請給我一個關於Java語言可用的其他類型堆棧的簡要描述,以及它們的優點和缺點嗎?這些名稱是同質的嗎?例如。它們僅用於Java語言還是用作計算機科學中的一般術語?
謝謝
目前我唯一知道的唯一一個堆棧是Vector,我通常使用它來代替數組,但我知道還有其他類型的堆棧,它們都適合不同的作業。Java和不同類型的堆棧
我目前正在處理的項目要求我將對象插入堆棧中的某個位置,而不總是堆棧的前面,我的印象是Vector可能不是這個工作的最佳類。
有人請給我一個關於Java語言可用的其他類型堆棧的簡要描述,以及它們的優點和缺點嗎?這些名稱是同質的嗎?例如。它們僅用於Java語言還是用作計算機科學中的一般術語?
謝謝
我建議採取看看this tutorial on the Java Collections Framework,這是指所有在java.util
包的主數據類型,你會使用類似這樣的事情(列表,向量,地圖,樹木等)。
你提到你正在把東西插入到你的'堆棧'的中間。那麼我會推薦使用LinkedList
。
如果您已經找到需要輸入新元素的位置,則插入它的時間爲O(1)
。對於一個矢量,它是O(n)
,因爲你需要複製支持數組。
LinkedList
也支持類似堆棧的操作,如添加到結尾或彈出堆棧的結尾。
查看數據結構的javadocs以查看它提供的功能。
回答你最後一個問題。 LinkedList
是整個計算機科學中非常普遍的數據結構。它也常用於實現堆棧,因爲推入和彈出操作是恆定時間,O(1)
。
java.util.Stack
的API文檔建議您使用接口java.util.Deque
的其中一個實現,例如java.util.ArrayDeque
或java.util.LinkedList
。
A LinkedList
對於在中間插入元素並從頭部或尾部移除元素(但查找隨機元素效率低)是有效的。
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
他指定他會經常插入「堆棧」的中間。 – jjnguy 2010-06-15 17:49:53
我不認爲'堆棧'是實際需要的數據結構。 (純粹意義上的堆棧只允許訪問最近添加的元素) – jjnguy 2010-06-15 17:51:13
注意Vector和Stack已經過時,因爲所有的操作都是同步的。較新的實現不同步,並且由用戶根據需要進行同步,或者使用同步的包裝類來包裝列表(請參見java.util.Collections.synchronizedList())。 – AngerClown 2010-06-15 17:55:17
鏈表是一個相當內存效率低下的數據結構,通常不是堆棧的最佳實現;基於陣列的列表也提供了分期的O(1)push和pop。 – 2010-06-15 17:50:32
@Michael,但插入任何數組支持的結構的中間無論如何都會導致性能較差(O(n))。 – jjnguy 2010-06-15 17:53:40
@jinguy:是的,但他們提供O(1)隨機訪問。如果你同時需要(通常是這種情況),那麼這些相互抵消,並且內存效率使基於陣列的實現成爲更好的選擇。只有在迭代期間經常需要添加/刪除並且不需要隨機訪問時,鏈接列表纔是一個不錯的選擇。 – 2010-06-15 17:57:55