【问题标题】:Does iterator violate stack/queue data structure?迭代器是否违反堆栈/队列数据结构?
【发布时间】:2017-09-07 21:30:29
【问题描述】:

正如我们所知,Java 中每个实现Collection 接口的类都应该实现Iterator<E> iterator() 方法。

StackQueue 是集合层次结构的一部分,也实现了这个方法。所以我们可以这样写:

Stack stack = new Stack();
//    Deque stack = new ArrayDeque<>();
stack.add( "1" );
stack.add( "2" );
stack.add( "3" );

Iterator i = stack.iterator();
while ( i.hasNext() ) {
  Object o = i.next();
  if ( o.equals( "2" ) ) {
    i.remove();
  }
}

我担心的是:

  1. 我们可以从堆栈/队列的中间删除元素吗?

  2. 堆栈/队列应该只“显示”一个元素(堆栈中的最后一个元素和队列中的第一个元素)是否可以,但实际上我们能够在不调用“pop”、“enqueue”方法的情况下获取所有元素?

【问题讨论】:

  • 不要使用原始类型。

标签: java data-structures collections iterator


【解决方案1】:

在最严格的意义上,StackQueue 不应允许对其元素进行迭代,但存在此限制的唯一原因是证明这些数据结构的存在是合理的。根据sgi

堆栈不允许迭代其元素。

这个限制是堆栈存在的唯一原因。请注意,任何前插入序列或后插入序列都可以用作堆栈;以vector为例,栈操作是成员函数back、push_back和pop_back。使用容器适配器堆栈的唯一原因是要明确说明您只执行堆栈操作,而不执行其他操作。

虽然一些实现遵循这一点,例如 C++ 中的 std::stack 不公开 iterator,但其他实现提供迭代器作为一项功能。 Java 中的Stack 建立在实现iteratorVector 之上。 Queue 建立在 Collection 之上,需要实现 iterator。回答您的问题

我们可以从堆栈/队列中间删除元素吗?

是的。底层实现将确保您的堆栈/队列在删除后处于一致状态。

堆栈/队列应该只“显示”一个元素(堆栈中的最后一个元素和队列中的第一个元素)是否可以,但实际上我们能够在不调用“pop”、“enqueue”方法的情况下获取所有元素?

是的,它是底层实现的一个特性。

【讨论】:

    【解决方案2】:

    我们可以从中间删除元素吗 堆栈/队列?

    是的,因为堆栈/队列即使在删除之后也会保持合同,毕竟堆栈/队列公开的所有方法都操纵了用于删除的内部实现

    堆栈/队列应该只“显示”一个元素(最后在 堆栈和队列中的第一个)但实际上我们能够获得所有这些 不调用“pop”、“enqueu”方法?

    是的,您没有违反任何一项合同,因为删除已完成,抛出元素的迭代器接口而不是队列或堆栈

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多