循环队列和循环链表

Circular Queue and Circular Linked List

本文关键字:循环链表 队列 循环      更新时间:2023-10-16

我想在循环队列和循环单链表之间有明显的区别??虽然一开始,两者看起来几乎相同。

循环队列或循环缓冲区:是一种实现队列的方法。 例如,假设您要使用数组实现队列。 你会有你的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 您会注意到循环队列在标准定义中是作为数组实现的。

循环链表和循环队列/循环缓冲区/环形缓冲区之间的主要区别在于:

  • 在循环链表中,最后一个节点的下一个指针指向(链表的)头部。在循环缓冲区中,我们只需维护两个指向缓冲区开始和结束的前后索引。

  • 除非另有说明(插入或删除的位置),否则它发生在末尾/尾部。在循环缓冲区的情况下,删除发生在前面的索引和尾部的添加;即,消费者从缓冲区的前面消费,生产者附加到末尾。