700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 数据结构与算法之环形队列

数据结构与算法之环形队列

时间:2018-09-05 17:52:39

相关推荐

数据结构与算法之环形队列

#数据结构与算法

上一节中关于队列存在一个问题,队列是一次性队列,其实也是数组只用了一次,无法再次往队列中添加数据,这是数组实现队列的bug,所以在这一节会解决这个bug,采用环形队列的形式解决。

环形队列的思路如下

front:表示队列的第一个元素的位置,front初始值默认为0

rear:表示队列的最后一个元素的后一个位置,rear初始值默认为0,因为需要空出一个空间作为“约定”

当队列满时,条件是(rear + 1) % maxSize == front

当队列为空,条件是rear = front

当这样分析后,队列中有效的数据个数为(rear + maxSize - front) % maxSize

数组实现环形队列是数据结构的第一个难度,首先需要声明数组实现环形队列的方法有很多,但是这种是我个人觉得比较好理解的一种,这里做一下总结:front指针表示队首,并且控制出队;rear指针表示队尾的后一个位置,并且表示入队;队列长度为L时,队列可以存储的有效数据为L-1,因为空出一个空间作为约定,并且这个空间在不断的变化。

这里解释一下上面这张图:初始化队列的时候,队列的空间为4,队首指针front=0,队尾指针rear=0;把10入队,入队的时候front不动,将rear后移,即rear=(rear+1)%maxsize;当rear等于front时,表示队列满了。出队的时候rear不动,front后移,即front = (front+1)%maxsize;

环形队列就可以将队列无限次使用。

二、环形队列的代码实现

这里总结一下,环形队列并不是在内存中是向一个手环一样存储的,实际上你使用数组实现,在内存中就是一个普通的数组,这个数组长度是固定的,但是通过两个指针front和rear,取余的方式将这个队列变成了环形队列,而不像上一节说的那样的一个一次性的队列,环形队列的有点更加多,比如可以充分利用元素空间,其次出队速度和入队速度都非常快。

使用取余的方式做环形队列是需要注意一点,就是如果队列的长度为5的话,那么队列最多可以存储4个元素,因为需要空出一个空间来作为取余的约定,这个用文字表达起来很麻烦,只要按照这篇文章首部的图片所示,自己在草稿纸上画一个这样的示意图,那么对于环形队列的理解就非常深刻了。

这里说一句题外话,环形队列是数据结构与算法中第一个难点,前面的稀疏数组和队列都是比较简单的,但是环形队列是比较难理解的,后面还有更加难的单向环形链表等等,要坚持下去,我也会坚持下去尽量用好理解的白话讲述数据结构与算法的。

另外,每篇文章中涉及的java代码都是我自己亲自编写测试的,不是复制粘贴的,所以100%可以运行,并且写好了大量的注释,如果看了文章还不理解,可以复制代码粘贴到eclipse或者idea中运行看看,这样便于理解。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。