迭代器是否违反堆栈/队列数据结构?

时间:2017-04-12 08:07:58

标签: java data-structures collections iterator

正如我们在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”方法的情况下获得所有这些元素?

2 个答案:

答案 0 :(得分:2)

从严格意义上讲,StackQueue不应允许迭代它的元素,但这种限制存在的唯一原因是证明这些数据结构的存在是正确的。根据{{​​3}}

  

Stack不允许迭代其元素。

     

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

虽然有些实现遵循这一点,例如C ++中的std::stack不公开iterator,但其他实现提供了迭代器作为特性。 java中的sgi构建在实现Vector的{​​{1}}之上。 Stack建立在iterator之上,需要Collection才能实施。回答你的问题

  

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

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

  

堆栈/队列应该&#34;显示&#34;只有一个元素(最后一个在堆栈中,第一个在队列中)但实际上我们能够在不调用&#34; pop&#34;,&#34; enqueue&#34;的情况下获得所有这些元素。方法

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

答案 1 :(得分:1)

  

我们能否从中间删除元素是否可以   栈/队列?

是的,因为在堆栈/队列暴露的所有方法操作用于删除的内部实现之后,堆栈/队列都将在删除后保持合同

  

堆栈/队列应该“只显示”一个元素(最后一个)是否可以   堆栈和第一个队列)但实际上我们能够得到所有这些   没有调用“pop”,“enqueu”方法?

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