如何在Java中使用带堆栈的迭代器

如何在Java中使用带堆栈的迭代器,java,collections,Java,Collections,众所周知,堆栈是一种遵循后进先出顺序的数据结构。根据我的知识,堆栈只允许访问顶层元素。但在Java中,我们可以使用迭代器和堆栈,这与上述只允许访问顶层元素的思想相矛盾 示例代码 Stack<Integer> s=new Stack<Integer>(); s.push(10); s.push(20); s.push(30); ------------------------------------------------------

众所周知,堆栈是一种遵循后进先出顺序的数据结构。根据我的知识,堆栈只允许访问顶层元素。但在Java中,我们可以使用迭代器和堆栈,这与上述只允许访问顶层元素的思想相矛盾

示例代码

    Stack<Integer> s=new Stack<Integer>();
    s.push(10);
    s.push(20);
    s.push(30);
    ------------------------------------------------------------------------
    Iterator<Integer> itr=s.iterator();
    while(itr.hasNext())
    {
      System.out.print(itr.next() + " ");    // ouput:- 10 20 30
    }
Stack s=新堆栈();
s、 推(10);
s、 推(20);
s、 推(30);
------------------------------------------------------------------------
迭代器itr=s.Iterator();
while(itr.hasNext())
{
System.out.print(itr.next()+“”);//输出:-10 20 30
}
现在我在堆栈上有了一个迭代器,它可以按FIFO顺序遍历堆栈,甚至可以使用itr.remove()删除任何元素

这很令人困惑:)

请解释一下

PS:如果我在迭代器的位置使用listIterator,那就更令人困惑了,因为前者提供了更多的方法。

Java
Stack
提供了比后者更多的操作。这很可能是出于历史原因,因为
Stack
是Java1.0的一部分,它的设计者决定从
Vector
派生出来。这就是从
向量
的操作如何变成
堆栈
上的操作。一旦允许对公共类执行其他公共操作,就无法收回它们


但是,这并不意味着该类在某种程度上被破坏:如果您不希望使用
Vector
提供的附加操作,请不要在代码中使用它们。

“仅顶部元素”肯定是错误的。堆栈通常允许您访问相对于顶部的元素:top-1、top-2等。迭代器只允许您以相同的方式遍历所有元素。您可能应该避免使用堆栈作为其支持向量,因为每个方法都是线程安全的。这与“纯”理论堆栈稍有出入,大多数情况下您不会使用它(除了打印和调试您的堆栈),但这很方便:)您可以看到堆栈的定义为“它有push,pop,top”,而不是“它只有push,pop,top”可能与您要查找的
Deque
重复,如
stack
文档中所述。如果切换到,按照
堆栈
的建议。如果
Stack
还不是一个类,他们很可能会添加一个
Stack
接口,其中只包含
push()
pop()
peek()
方法。