Java和不同类型的堆栈

Java和不同类型的堆栈,java,data-structures,vector,stack,Java,Data Structures,Vector,Stack,目前我所知道的唯一堆栈是Vector,我通常用它来代替数组,但我知道还有其他类型的堆栈,它们都适合不同的工作 我目前正在从事的项目要求我在堆栈中的某个位置插入对象,而不总是在堆栈的前端,我的印象是向量可能不是这项工作的最佳类 有人能给我简要介绍一下Java语言中其他类型的栈,以及它们的优缺点吗?这些名字是相同的吗?例如,它们是仅在Java语言中使用,还是作为计算机科学中的通用术语使用 谢谢我建议看一看,它指的是java.util包中的所有主要数据类型,您将使用这些数据类型(列表、向量、地图、树等

目前我所知道的唯一堆栈是Vector,我通常用它来代替数组,但我知道还有其他类型的堆栈,它们都适合不同的工作

我目前正在从事的项目要求我在堆栈中的某个位置插入对象,而不总是在堆栈的前端,我的印象是向量可能不是这项工作的最佳类

有人能给我简要介绍一下Java语言中其他类型的栈,以及它们的优缺点吗?这些名字是相同的吗?例如,它们是仅在Java语言中使用,还是作为计算机科学中的通用术语使用


谢谢

我建议看一看,它指的是
java.util
包中的所有主要数据类型,您将使用这些数据类型(列表、向量、地图、树等)。

您提到要将内容插入到“堆栈”的中间。然后我建议使用
LinkedList

如果已经找到需要输入新元素的位置,则插入该位置的时间为
O(1)
。对于向量,它是
O(n)
,因为需要复制备份数组

LinkedList
还支持类似堆栈的操作,如添加到堆栈末尾或弹出堆栈末尾

请看一下数据结构的示例,看看它都提供了什么


来回答你的最后一个问题。
LinkedList
是整个计算机科学中非常常见的数据结构。它还非常常用于实现堆栈,因为推送和弹出操作是恒定时间,
O(1)
java.util.Stack
的API文档建议您使用interface
java.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可能更好。