反向堆栈迭代器

时间:2013-11-14 15:29:07

标签: java stack

我想知道如何从顶部开始迭代Stack的元素,而不使用任何额外的内存。我相信默认iterator()从下到上。我还注意到Deque有一个descendingIterator。我无法找到类似于堆栈的任何东西。我只是想知道是否有可能这样做,没有特别的。如果这是不可能的,哪个其他Java数据结构提供Stack的功能,并且能够向后迭代它(Deque ofc除外)?

2 个答案:

答案 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?,并且Stackvector延伸,它的使用也是不鼓励的。此外,在Stack类的JavaDoc中,作者现在添加此信息(强调我的):

  

Deque接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应该优先于此类使用


  

我还注意到,对于Deque,有一个descendingIterator ...

正如评论中所指出的,技术(在本例中为Java)帮助您迭代数据结构的事实是好的(或者坏,取决于您如何看待/使用它)。

请注意,Deque是一个双端队列,可以作为堆栈和队列使用,具体取决于您希望/需要使用它的方式。

由于DequeIterable延伸,它应该提供Iterator,以便可以使用特定行为(如元素序列)访问其元素,此迭代器将访问从头到尾的元素,比如在队列中导航。 descendingIterator返回一个迭代器来访问从最后到第一个的元素,就像在堆栈中导航一样。但同样,请考虑到这是技术带来的好处。

  

如果这是不可能的,那么其他Java数据结构提供Stack的功能是否能够向后迭代它(Deque ofc除外)?

除了并发子节点BlockingDeque之外,看起来不像常见的Java接口。这是由这种设计驱动的:What does it mean to "program to an interface"?。请注意,您可以使用ArrayList或其他结构从头开始创建堆栈,或者使其表现得像一个堆栈,但仍由您决定。