循环队列和循环链表
Circular Queue and Circular Linked List
我想在循环队列和循环单链表之间有明显的区别??虽然一开始,两者看起来几乎相同。
循环队列或循环缓冲区:是一种实现队列的方法。 例如,假设您要使用数组实现队列。 你会有你的enqueue()
和dequeue()
方法。
假设基础数组的长度为 7,并且用户将五个值排队,因此基础数组中的值如下所示:
head tail
position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
value: | 3 | 12 | 5 | 4 | 71 | free | free |
现在,用户想要取消元素的排队,从位置0
中删除值3
。 作为队列实现者,您必须弄清楚如何处理这个问题。 一个基本的解决方案是将所有值下移一个位置,因此底层数组现在如下所示:
head tail
position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
value: | 12 | 5 | 4 | 71 | free | free | free |
但这可能需要在每次取消排队时不必要地复制大量值! 避免这种情况的一种方法是说你的头部现在处于位置 1 而不是 0,
head tail
position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
value: | free | 12 | 5 | 4 | 71 | free | free |
所以现在每次你添加一个新元素,你只需将其添加到tail
(并增加tail
位置),如果你删除一个元素,你只会移动head
。 这样,您就不必进行任何不必要的复制。
一旦tail
到达数组的末尾,它将开始包装到数组的开头 - 即队列将在底层数组上"圆圈"移动。 例如,在再排队和取消排队几次之后,底层数组将如下所示:
tail head
position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
value: | 91 | free | free | free | 71 | 22 | 8 |
尾巴现在缠绕到阵列的开头。
循环链表:头部指向尾部的链表。 这是一个通用的圆形结构。 它可用于实现循环队列/缓冲区,也可以用于其他用途。
看看这个: http://www.vias.org/cppcourse/chap20_05.html 您会注意到循环队列在标准定义中是作为数组实现的。
循环链表和循环队列/循环缓冲区/环形缓冲区之间的主要区别在于:
-
在循环链表中,最后一个节点的下一个指针指向(链表的)头部。在循环缓冲区中,我们只需维护两个指向缓冲区开始和结束的前后索引。
-
除非另有说明(插入或删除的位置),否则它发生在末尾/尾部。在循环缓冲区的情况下,删除发生在前面的索引和尾部的添加;即,消费者从缓冲区的前面消费,生产者附加到末尾。
- 使用std::list创建循环链表
- 循环链表:无限循环
- 打印循环链表
- C++循环链表删除,计数从下一个节点开始
- C++ 循环链表的递归基本情况
- 循环链表的内存错误:未分配正在释放的指针
- 返回指向循环链表某个点的指针
- 在 for 循环(链表)中删除两次后,变量不可用
- 尝试拆分循环链表.显示输出但崩溃.在 IDEone 中显示运行时错误
- 学习在C++中实现链表队列
- 如何打印出双向循环链表
- 循环队列和循环链表
- 我想在我的代码中实现一个双重循环链表 - 运行时错误
- 迭代器实现 -(链表队列)
- 用C++打印出循环链表
- 需要帮助编码迭代器的循环链表在c++
- 获取单个非循环链表中指针后面节点的值
- 删除循环链表中的节点
- 循环链表的循环开始节点
- 如何将链表转换为循环链表