目前我唯一知道的堆栈是Vector,我通常使用它来代替数组,但我知道还有其他类型的堆栈,它们都适合不同的工作。
我目前正在处理的项目要求我将对象插入堆栈内的某个位置,而不是总是在堆栈的前面,而且我认为Vector可能不是这项工作的最佳类。
有人可以给我一个关于Java语言可用的其他类型堆栈的简要描述及其优缺点吗?这些名字是否同质?例如。它们仅用于Java语言还是用作计算机科学中的通用术语?
谢谢
答案 0 :(得分:3)
您提到您正在将内容插入“堆栈”中间。然后我建议使用LinkedList
。
如果您已经找到了输入新元素所需的位置,则插入它的时间为O(1)
。对于向量,它是O(n)
,因为您需要复制支持数组。
LinkedList
还支持类似堆栈的操作,例如添加到结尾,或弹出堆栈的末尾。
查看数据结构的javadocs,了解它的全部内容。
回答你的上一个问题。 LinkedList
是整个计算机科学中非常常见的数据结构。它也非常常用于实现堆栈,因为推送和弹出操作是恒定的时间O(1)
。
答案 1 :(得分:3)
java.util.List
是表示为Java接口的列表类型java.util.Deque
是一个Java接口,它提供LIFO和FIFO队列行为(因此堆栈行为作为子集)java.util.Vector
是一个不再使用的列表(基于自动调整大小数组)的过时实现java.util.ArrayList
是其现代化的替代品java.util.Stack
是一个过时的堆栈实现,包括向Vector添加一些类似堆栈的方法,这不是一个好方法。java.util.ArrayDeque
是Deque界面的现代实现java.util.LinkedList
是列表的不同实现(也实现了Deque接口),它有许多大的缺点,只能在非常特殊的情况下使用(它更好)当您需要经常插入或删除列表中的元素时。)基本上,如果你想要一个堆栈,可以使用Deque
接口和ArrayDeque
作为实现类(除了LinkedList
更好的极少数情况除外)。如果您需要列表,请使用ArrayList
答案 2 :(得分:1)
我建议看一下this tutorial on the Java Collections Framework,它引用java.util
包中的所有主要数据类型,你将用于这样的事情(列表,向量,地图,树等)
答案 3 :(得分:1)
java.util.Stack
的API文档建议您使用接口java.util.Deque
的其中一个实现,例如java.util.ArrayDeque
或java.util.LinkedList
。
LinkedList
可以有效地在中间插入元素并从头部或尾部移除元素(但查找随机元素效率不高)。