正如我们在Java中所知,实现Collection
接口的每个类都应该实现Iterator<E> iterator()
方法。
Stack
和Queue
是集合层次结构的一部分,并且也实现了此方法。所以我们可以这样写:
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();
}
}
我的担忧是:
我们能够从堆栈/队列中间删除元素吗?
堆栈/队列应该“只显示”一个元素(堆栈中的最后一个,队列中的第一个)是否可以,但实际上我们能够在不调用“pop”,“enqueue”方法的情况下获得所有这些元素?
答案 0 :(得分:2)
从严格意义上讲,Stack
和Queue
不应允许迭代它的元素,但这种限制存在的唯一原因是证明这些数据结构的存在是正确的。根据{{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”方法?
是的,你没有违反任何一个合同,因为删除完成抛出元素的迭代器接口而不是队列或堆栈