我想知道如何从顶部开始迭代Stack
的元素,而不使用任何额外的内存。我相信默认iterator()
从下到上。我还注意到Deque
有一个descendingIterator
。我无法找到类似于堆栈的任何东西。我只是想知道是否有可能这样做,没有特别的。如果这是不可能的,哪个其他Java数据结构提供Stack
的功能,并且能够向后迭代它(Deque
ofc除外)?
答案 0 :(得分:2)
Stack
是Java 1.2(和Java Collections Framework)之前的一个非常古老的类。如果可以,我建议您切换到使用Deque
,正如您所说,已经拥有您需要的所有功能。
答案 1 :(得分:2)
我想知道如何从顶部开始迭代Stack的元素,而不使用任何额外的内存。
根据概念,stack 无法至少迭代您弹出其所有元素。周期。
这里的主要问题是您将此堆栈数据结构与Java Stack
混淆,后者从其超级类iterator
为您提供Vector
,可能会使您感到困惑。事实上,这是来自Java 1的设计问题。不鼓励使用Vector
类,如此处所述:Why is Java Vector class considered obsolete or deprecated?,并且Stack
从vector
延伸,它的使用也是不鼓励的。此外,在Stack
类的JavaDoc中,作者现在添加此信息(强调我的):
Deque
接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应该优先于此类使用。
我还注意到,对于
Deque
,有一个descendingIterator
...
正如评论中所指出的,技术(在本例中为Java)帮助您迭代数据结构的事实是好的(或者坏,取决于您如何看待/使用它)。
请注意,Deque
是一个双端队列,可以作为堆栈和队列使用,具体取决于您希望/需要使用它的方式。
由于Deque
从Iterable
延伸,它应该提供Iterator
,以便可以使用特定行为(如元素序列)访问其元素,此迭代器将访问从头到尾的元素,比如在队列中导航。 descendingIterator
返回一个迭代器来访问从最后到第一个的元素,就像在堆栈中导航一样。但同样,请考虑到这是技术带来的好处。
如果这是不可能的,那么其他Java数据结构提供Stack的功能是否能够向后迭代它(
Deque
ofc除外)?
除了并发子节点BlockingDeque
之外,看起来不像常见的Java接口。这是由这种设计驱动的:What does it mean to "program to an interface"?。请注意,您可以使用ArrayList
或其他结构从头开始创建堆栈,或者使其表现得像一个堆栈,但仍由您决定。