循环队列理论

Circular Queue theory

我需要帮助来理解循环队列的概念。我在 Whosebug 上阅读了一些 post,none 的答案正在回答我遇到的心理障碍。

例如,我在循环队列中有 8 个单元格。

        Head                              Tail
 empty|U    |   I  |   S  |   K  |   M  |   empty  |   empty 

假设我插入两个字符F & P,这将使队列变为。

  Tail  Head                                
 empty|U    |   I  |   S  |   K  |   M  |   F  |   P 

现在让事情变得有趣起来,如果我删除 3 个条目会怎么样。

  Tail                                  Head                
 empty|  empty  |  empty   |  empty   |   K  |   M  |   F  |   P 

很明显,我的头和尾现在已经改变了,我有 3 个新的可用位置。但是为了好的措施,我想再添加两个条目。

            Tail                Head                
 A|  B  |  empty   |  empty   |   K  |   M  |   F  |   P 

这是我的问题

我做对了吗?大声笑当你完全填满队列时会发生什么,因为尾部和头部处于相同的位置,即 "K"?如果有人能更详细、更清晰地解释这个概念,我将不胜感激。

谢谢!

在我看来你是对的。您可以通过显示 head 和 tail

的整数值使图表更清晰

关于循环队列的解释和例子很多。我没有找到比我在一段时间前提供的答案中发布的更好的解释 here。它解释了队列为空、有空间或已满时如何显示头部和尾部。

在图表的最后一行,队列还有 2 个项目的空间。添加三分之一会使 tail = head,并覆盖 K,这是您不想做的。

当tail = head时,队列为空。测试完整队列稍微复杂一些。有关完整说明,请参阅 link。

Did I implement this right?

是的,你确实做到了。

What happens when you fill the queue up completely as in the Tail and Head are in the same position i.e "K"?

K 将被覆盖。这个溢出条件可以通过条件 TAIL == HEAD.

来检查

If some one can explain this concepts a little more detail and clarity I would appreciated it.

您必须了解的是,在传统的线性 FIFO 队列中,只要达到最大大小,就需要连续移动元素。例如,如果队列的大小为 5,则在连续插入 5 次(编号 1-5)然后删除(编号 1 被删除)之后,队列变为 [null, 2, 3, 4, 5]。您可以在此处看到,尽管还有 1 个元素的位置,但除非将所有元素向上移动一个,否则您无法插入。这就是使用循环队列的原因。它不需要元素移动。

但是,如果您的队列不断被溢出,队列的整个目的就失去了。我建议使用链表(线性或循环),因为它会动态添加和删除元素。

请记住,当内存有限时,实际使用队列。例如。 Input/Output 流是一个队列。当内存充足且不喜欢数据覆盖时,使用链表。