繁体   English   中英

循环队列和循环链接列表

[英]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您将注意到,循环队列在标准定义中作为数组实现。

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

  • 在循环链表中,最后一个节点的下一个指针指向链表的头。 在循环缓冲区中时,我们只需要在缓冲区的开头和结尾保持两个索引,它们分别指向缓冲区的开头和结尾。

  • 除非另有说明(插入或删除的位置),否则发生在末尾。 如果使用循环缓冲区,则会在前索引处删除,并在末尾添加; 也就是说,消费者从缓冲区的前端进行消费,而生产者则从缓冲区的末尾追加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM