循环队列理论
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 流是一个队列。当内存充足且不喜欢数据覆盖时,使用链表。
我需要帮助来理解循环队列的概念。我在 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 流是一个队列。当内存充足且不喜欢数据覆盖时,使用链表。