我想知道如何在不使用任何额外内存的情况下迭代 aStack
从顶部开始向下的元素。我相信默认iterator()
是从下到上的。我还注意到Deque
有一个descendingIterator
. 对于堆栈,我无法找到与此类似的任何东西。我只是想知道是否可以这样做,没有什么特别的。如果这是不可能的,那么哪些其他 Java 数据结构提供了 a 的功能Stack
并且能够向后迭代它(Deque
ofc 除外)?
2 回答
Stack
是 Java 1.2(和 Java 集合框架)之前的一个非常古老的类。如果可以的话,我建议您切换到 using Deque
,正如您所说,它已经具备您需要的所有功能。
我想知道如何在不使用任何额外内存的情况下从顶部开始遍历 Stack 的元素并向下遍历。
从概念上讲,堆栈 不能被迭代,至少你弹出它的所有元素。时期。
这里的主要问题是您将此堆栈数据结构与 Java 混淆了,JavaStack
为您提供了iterator
来自其超类的 , Vector
,这可能会让您感到困惑。实际上,这是来自 Java 1 的设计问题。Vector
不鼓励使用类,如下所述:为什么 Java Vector 类被认为已过时或已弃用?,并且由于从Stack
扩展vector
,因此也不鼓励使用它。此外,在Stack
该类的 JavaDoc 中,作者现在添加了以下信息(强调我的):
Deque
接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用此类。
我还注意到,因为
Deque
有一个descendingIterator
...
如评论中所述,该技术(在本例中为 Java)可以帮助您迭代数据结构这一事实是好的(或坏的,取决于您如何看待/使用它)。
请注意,这Deque
是一个双端队列,可以作为堆栈和队列工作,具体取决于您希望/需要如何使用它。
由于Deque
extends from Iterable
,它应该提供一个Iterator
顺序,以便可以使用特定行为(如元素序列)访问其元素,此迭代器将从第一个到最后一个访问元素,就像在队列中导航一样。返回一个迭代器来从最后一个到第descendingIterator
一个访问元素,就像在堆栈中导航一样。但同样,请考虑到这是技术带来的好处。
如果这是不可能的,那么哪些其他 Java 数据结构提供了 Stack 的功能,并且能够向后迭代它(
Deque
ofc 除外)?
除了它的并发子 ,BlockingDeque
看起来不在常见的 Java 接口中。这是由这种设计驱动的:“编程到接口”是什么意思?. 请注意,您可以使用或其他结构从头开始创建堆栈ArrayList
,或者使其行为像一个,但仍然取决于您。