2012-04-07 94 views
3

基本上我得到了一个CircularQueue的实现,我需要实现一个名为'public boolean contains(E other)'的方法,如果参数'其他“存在于我的队列中。在不使用临时队列的情况下遍历一个循环队列

我对它很好,因为它是一个数组,但后来我看到了这个正在扰乱我的其他条件。

请记住,您无法自由浏览队列中的所有元素。只有前面的元素可以在任何时候通过peek方法访问 。您的contains和intersectWith方法的实现必须不使用任何额外的队列来临时保存此队列的某些元素。

Iterator是否适用于解决此问题?

任何帮助,高度赞赏。

Mjall

解决方案:

答案我想出了, 方法旋转描述: 方法旋转(INT N)从队列中移除的前n个元素,并将它们添加到的后队列中的 。这些元素以相同的顺序添加到队列尾部,因为它们从队列的前面 中删除。例如,给定包含元素\ A,B,C,d,E”,其中A元素是 在队列的前部的队列Q,以下方法调用q.rotate(2),的内容队列将是\ C,D,E, A,B“;

public boolean contains(E elem) { 

    while(this.isEmpty() != true){ 

     if(this.peek() == elem){return true;} 
     else{rotate(1);} 



    } 
    return false; 

} 
+0

一个元素可以在队列中两次? [我的意思是实际的对象,身份不平等] - 如果没有,为什么你不能持有脑袋的临时参考,并迭代,直到你再次看到它? – amit 2012-04-07 22:42:33

+0

@amit:这听起来像约束是你不能迭代。 “只有前面的元素可以随时访问”。 – 2012-04-07 22:43:17

+0

@OliCharlesworth:在这个循环队列中,如果弹出所有元素,队列是空的还是会返回到旧的头部? [我以为第二和refered它作为迭代] – amit 2012-04-07 22:44:56

回答

1

迭代器对于这种情况并不实际。

由于它是一个循环队列,因此您可以记住您已经看到的第一件事(不一定完全从循环队列中将其删除),并将列队出列/排队,直到找到您要找的内容或到达第一个出队节点。

+0

这就是我想,但为了从一个队列中退出,然后排队到不同的临时队列,而这样做检查值是否是存在的,那么从临时离队排队并排入原始队列(以维护原始数据)。不允许.. – Mjall2 2012-04-07 22:44:52

+0

如果头被推两次会怎么样?扫描所有元素之前,您将停止。谁说临时队列什么: – amit 2012-04-07 22:45:17

+0

@ Mjall2 [我通过队列假设到节点对象没有访问权限,只给元素对象] – 2012-04-07 22:45:40