Java和不同类型的堆栈
目前我所知道的唯一堆栈是Vector,我通常用它来代替数组,但我知道还有其他类型的堆栈,它们都适合不同的工作 我目前正在从事的项目要求我在堆栈中的某个位置插入对象,而不总是在堆栈的前端,我的印象是向量可能不是这项工作的最佳类 有人能给我简要介绍一下Java语言中其他类型的栈,以及它们的优缺点吗?这些名字是相同的吗?例如,它们是仅在Java语言中使用,还是作为计算机科学中的通用术语使用Java和不同类型的堆栈,java,data-structures,vector,stack,Java,Data Structures,Vector,Stack,目前我所知道的唯一堆栈是Vector,我通常用它来代替数组,但我知道还有其他类型的堆栈,它们都适合不同的工作 我目前正在从事的项目要求我在堆栈中的某个位置插入对象,而不总是在堆栈的前端,我的印象是向量可能不是这项工作的最佳类 有人能给我简要介绍一下Java语言中其他类型的栈,以及它们的优缺点吗?这些名字是相同的吗?例如,它们是仅在Java语言中使用,还是作为计算机科学中的通用术语使用 谢谢我建议看一看,它指的是java.util包中的所有主要数据类型,您将使用这些数据类型(列表、向量、地图、树等
谢谢我建议看一看,它指的是
java.util
包中的所有主要数据类型,您将使用这些数据类型(列表、向量、地图、树等)。您提到要将内容插入到“堆栈”的中间。然后我建议使用LinkedList
如果已经找到需要输入新元素的位置,则插入该位置的时间为O(1)
。对于向量,它是O(n)
,因为需要复制备份数组
LinkedList
还支持类似堆栈的操作,如添加到堆栈末尾或弹出堆栈末尾
请看一下数据结构的示例,看看它都提供了什么
来回答你的最后一个问题。
LinkedList
是整个计算机科学中非常常见的数据结构。它还非常常用于实现堆栈,因为推送和弹出操作是恒定时间,O(1)
java.util.Stack
的API文档建议您使用interfacejava.util.Deque
的一种实现,例如java.util.ArrayDeque
或java.util.LinkedList
a>代码> LIKEDLIST//COD>对于插入元素在中间和从头部或尾部删除元素是有效的(但是对于查找随机元素来说效率很低)。
UL>java.util.List
是表示为java接口的列表类型java.util.Deque
是一个java接口,它提供LIFO和FIFO队列行为(从而将堆栈行为作为一个子集)java.util.Vector
是一种过时的列表实现(基于自动调整大小的数组),不应再使用java.util.ArrayList
是它的现代化替代品java.util.Stack
是一个过时的堆栈实现,它包括向向量添加一些类似堆栈的方法,这不是一个好方法java.util.ArrayDeque
是Deque接口的现代实现java.util.LinkedList
是一个列表的不同实现(它也实现了Deque接口),它有许多很大的缺点,只能在非常特定的情况下使用(当您需要经常在列表中插入或删除元素时更好)基本上,如果您想要一个堆栈,可以使用
Deque
接口和ArrayDeque
作为实现类(除了LinkedList
更好的罕见情况)。如果您想要一个列表,请使用ArrayList
他指定他将经常在“堆栈”的中间插入。我不认为“堆栈”是实际需要的数据结构。(从纯意义上讲,堆栈只允许访问最近添加的元素)注意,向量和堆栈是过时的,因为所有操作都是同步的。较新的实现是不同步的,用户可以根据需要进行同步或使用同步包装类包装列表(请参见java.util.Collections.synchronizedList())。@jinguy:“经常”未指定:)也没有随机访问。请注意,ArrayQue自1.6起为@。链表是一种内存效率较低的数据结构,通常不是堆栈的最佳实现;基于数组的列表也提供了摊销的O(1)推送和弹出。@Michael,但是插入到任何数组支持的结构的中间都会有很差的(O(n))性能。@jinguy:是的,但它们提供了O(1)随机访问。如果两者都需要(通常是这样),那么它们会相互抵消,而内存效率使基于阵列的实现成为更好的选择。只有在迭代过程中经常需要添加/删除并且不需要随机访问的情况下,链接列表才是一个好的选择。在Link表上插入是O(1),但是在列表中间找到第n个元素仍然是O(n)。如果用例是插入的频率远低于搜索,那么与大量线性搜索相比,ArrayList的调整大小代价可能无关紧要。如果几乎所有的工作都是搜索,那么HashSet或LinkedHashSet可能更好。