2013-11-14 70 views
-2

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

+3

你有什么打算?如果你试图这样做,那么你不应该使用堆栈开始。 –

+0

这似乎是一个奇怪的选择。为什么在想要FIFO功能时使用FILO? – Dragondraikk

+0

如果您明白[stack](http://en.wikipedia.org/wiki/Stack_(abstract_data_type))只给出了顶部(或底部)的项目,那么您应该已经理解了答案。这里的人不是燃烧的,你甚至得到了答案。看起来你的问题在考虑你使用什么结构来实现堆栈,并利用这个结构的能力解决不同的问题。如果您将结构视为堆栈(而不是其实现),那么这是不可能的。如果你看到的结构是一个数组或双链表,那么这是可能的。 –

回答

2

我想知道如何从顶部开始迭代堆栈的元素,并不需要使用任何额外的内存。

通过概念,一个stack不能那你弹出它的所有元素至少被重复。期。

这里的主要问题是,您将这个堆栈数据结构与Java Stack混淆,它会为您提供来自其超类Vectoriterator,可能会让您感到困惑。事实上,这是一个来自Java 1的设计问题。不鼓励使用Vector类,如下所述:Why is Java Vector class considered obsolete or deprecated?,并且因为Stackvector延伸,所以它的使用也是不鼓励的。此外,在Stack类的JavaDoc,作者现在添加此信息(emphasys矿):

LIFO堆栈操作的更完整,一致通过Deque接口提供和它的实现,这应该优先使用此类


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

正如评论指出,事实上,这项技术(在这种情况下,Java的)帮助您迭代在数据结构上是好的(或坏的,取决于你如何看待/使用它)。

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

由于DequeIterable延伸,它应当提供的Iterator它的元素可以使用类似元素的序列中的特定行为,这种迭代器将访问从第一元素到最后被访问,想通过队列导航。 descendingIterator返回一个迭代器来访问从上次到第一次的元素,如浏览堆栈。但是,再次考虑到这是技术带来的好处。

如果这是不可能的,那么其他Java数据结构提供堆栈的功能并且能够向后迭代(除了Deque ofc)?

除了它的并发子,BlockingDeque,看起来不像普通的Java接口。这是由这种设计驱动的:What does it mean to "program to an interface"?。请注意,您可以使用ArrayList或其他结构从头开始创建堆栈,或者使它像一个堆栈一样运行,但仍然取决于您。

2

Stack是Java 1.2之前的一个非常古老的类(和Java Collections Framework)。如果可以的话,我建议你改用Deque,正如你所说,它已经具备了你所需要的全部功能。

+0

OP已经知道它似乎 – Sage

+2

@Sage OP最终问到*有什么建议?*,这是一个有效的建议。 –

+1

@Sage OP知道'Deque',但我更加强调'Stack'是一个非常古老的类,它可能不会从Java维护者那里获得任何进一步的爱。就像'Vector'和'Hashtable'一样,它的排序不鼓励使用(即使不是官方的'@ Deprecated')。 –