【问题标题】:Circular Queue theory循环队列理论
【发布时间】:2015-04-08 04:27:23
【问题描述】:

我需要帮助来理解循环队列的概念。我在 stackoverflow 上阅读了几篇文章,但没有一个答案能回答我遇到的心理障碍。

例如,假设我在循环队列中有 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”?如果有人可以更详细和清晰地解释这个概念,我将不胜感激。

谢谢!

【问题讨论】:

标签: language-concepts


【解决方案1】:

在我看来你说得对。你可以通过显示头部和尾部的整数值让你的图表更清晰

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

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

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

【讨论】:

    【解决方案2】:

    我做对了吗?

    是的,你确实做到了。

    当你完全填满队列时会发生什么,因为尾巴和头在同一位置,即“K”?

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

    如果有人能更详细和清楚地解释这个概念,我将不胜感激。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2012-08-05
      • 2014-01-04
      • 2011-04-02
      • 1970-01-01
      • 2011-07-17
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多