我在想如何迭代Stack
的元素,从顶部开始往下走,而不使用任何额外的内存。我相信默认iterator()
从下到上。我还注意到,Deque
有一个descendingIterator
。我一直无法找到类似于这个堆栈的任何东西。我只是想知道是否可以做到这一点,没有什么特别的。如果这是不可能的,那么其他Java数据结构提供Stack
的功能并将其反向迭代(除了Deque
ofc)?反转堆栈迭代器
反转堆栈迭代器
回答
我想知道如何从顶部开始迭代堆栈的元素,并不需要使用任何额外的内存。
通过概念,一个stack不能那你弹出它的所有元素至少被重复。期。
这里的主要问题是,您将这个堆栈数据结构与Java Stack
混淆,它会为您提供来自其超类Vector
的iterator
,可能会让您感到困惑。事实上,这是一个来自Java 1的设计问题。不鼓励使用Vector
类,如下所述:Why is Java Vector class considered obsolete or deprecated?,并且因为Stack
从vector
延伸,所以它的使用也是不鼓励的。此外,在Stack
类的JavaDoc,作者现在添加此信息(emphasys矿):
LIFO堆栈操作的更完整,一致通过
Deque
接口提供和它的实现,这应该优先使用此类。
我还注意到,为
Deque
有一个descendingIterator
...
正如评论指出,事实上,这项技术(在这种情况下,Java的)帮助您迭代在数据结构上是好的(或坏的,取决于你如何看待/使用它)。
请注意,Deque
是一个双端队列,可以同时用作堆栈和队列,具体取决于您希望/需要使用它。
由于Deque
从Iterable
延伸,它应当提供的Iterator
它的元素可以使用类似元素的序列中的特定行为,这种迭代器将访问从第一元素到最后被访问,想通过队列导航。 descendingIterator
返回一个迭代器来访问从上次到第一次的元素,如浏览堆栈。但是,再次考虑到这是技术带来的好处。
如果这是不可能的,那么其他Java数据结构提供堆栈的功能并且能够向后迭代(除了
Deque
ofc)?
除了它的并发子,BlockingDeque
,看起来不像普通的Java接口。这是由这种设计驱动的:What does it mean to "program to an interface"?。请注意,您可以使用ArrayList
或其他结构从头开始创建堆栈,或者使它像一个堆栈一样运行,但仍然取决于您。
Stack
是Java 1.2之前的一个非常古老的类(和Java Collections Framework)。如果可以的话,我建议你改用Deque
,正如你所说,它已经具备了你所需要的全部功能。
OP已经知道它似乎 – Sage
@Sage OP最终问到*有什么建议?*,这是一个有效的建议。 –
@Sage OP知道'Deque',但我更加强调'Stack'是一个非常古老的类,它可能不会从Java维护者那里获得任何进一步的爱。就像'Vector'和'Hashtable'一样,它的排序不鼓励使用(即使不是官方的'@ Deprecated')。 –
- 1. '迭代器不可忽略'C++堆栈
- 2. Java:迭代两个堆栈
- 3. 递归反转堆栈
- 4. 如何反转堆栈?
- 5. 堆迭代器java
- 6. C++映射迭代和堆栈损坏
- 7. 嵌套的async.eachSeries堆栈迭代
- 8. 用堆栈和迭代器编写后缀计算器
- 9. Scala:将递归函数转换为使用堆栈迭代
- 10. 反转方法无法堆栈
- 11. 使用堆栈来反转字符串?
- 12. 使用堆栈反转字符串
- 13. (C++)使用堆栈反转字符串?
- 14. 反转从堆栈中的字符串
- 15. 使用堆栈反转字符串
- 16. Java堆栈反省
- 17. 迭代器值从反向迭代值转换
- 18. 为什么Java集转储堆栈上的ConcurrentModificationException异常有关Map迭代器?
- 19. 使用模板化堆栈编写迭代器
- 20. 栈迭代python3
- 21. 替代堆栈
- 22. 从堆栈转换堆栈arrayList
- 23. 我想实现一个队列,将反转堆栈和打印堆栈FIFO?
- 24. JSP Struts反向迭代器
- 25. 反向堆栈元素C++
- 26. UWSGI堆栈转储
- 27. 替代ZigBee堆栈
- 28. 堆栈PHP代码?
- 29. 启用MSVC调试迭代器时堆栈分配器访问冲突
- 30. JSON转换器 - 堆栈溢出
你有什么打算?如果你试图这样做,那么你不应该使用堆栈开始。 –
这似乎是一个奇怪的选择。为什么在想要FIFO功能时使用FILO? – Dragondraikk
如果您明白[stack](http://en.wikipedia.org/wiki/Stack_(abstract_data_type))只给出了顶部(或底部)的项目,那么您应该已经理解了答案。这里的人不是燃烧的,你甚至得到了答案。看起来你的问题在考虑你使用什么结构来实现堆栈,并利用这个结构的能力解决不同的问题。如果您将结构视为堆栈(而不是其实现),那么这是不可能的。如果你看到的结构是一个数组或双链表,那么这是可能的。 –