关于循环队列的一些讲解
2016-10-14 08:06
218 查看
前面讲到了队列的“假溢出”,解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。
比如昨天的例子,rear可以改为指向下标为0的位置,这样就不会造成指针指向不明的问题了。
但是如果继续进行入队操作的话,比如继续插入a6、a7,则rear指针就与front指针重合,同时指向下标为2的位置。
此时问题又出来了,我们刚才说,空队列时,等于rear,现在当队列满时,也是from等于rear,那么如何判断此时的队列究竟是空还是满呢?
办法一是设置一个标志变量flag,当front == rear,且flag = 0时为队列空,当front == rear,且flag= 1时为队列满。
办法二是当队列空时,条件就是from = rear,当队列满时,我们修改其条件,保留一个元素空间。也就是说,队列满时,数组中还有一个空闲单元。 如下图所示,我们就认为此队列已经满了,也就是说,我们不允许上图情况出现。
我们来讨论第二种方法,由于rear可能比front大,也可能比front小,所以尽管它们只相差一个位置时就是满的情况,但也可能是相差整整一圈。所以若队列的最大尺寸为QueueSize,那么队列满的条件是(rear+1) %QueueSize == front (取模“%的目的就是为了整合rear与front大小为一个问题)。
比如上面这个例子, QueueSize = 5,当 front=0,而 rear=4, (4+1) %5 = 0,所以此时队列满。再比如,front = 2而rear =1。(1 + 1) %5 = 2,所以此时 队列也是满的。而对于下图, front = 2而rear= 0, (0+1) %5 = 1,1!=2,所以此时队列并没有满。
另外,当rear > front时,此时队列的长度为rear—front。但当rear < front时,队列长度分为两段,一段是QueueSize-front,另一段是0 + rear,加在一起,队列长度为rear-front + QueueSize,因此通用的计算队列长度公式为:
(rear—front + QueueSize) % QueueSize
有了这些讲解,现在实现循环队列的代码就不难了。具体的例子程序可以参照前面说的顺序队列。
单是顺序存储,若不是循环队列,算法的时间性能是不高的,但循环队列又面临着数组可能会溢出的问题,所以我们还需要研究一下不需要担心队列长度的链式存储结构。
转自点击打开链接
比如昨天的例子,rear可以改为指向下标为0的位置,这样就不会造成指针指向不明的问题了。
但是如果继续进行入队操作的话,比如继续插入a6、a7,则rear指针就与front指针重合,同时指向下标为2的位置。
此时问题又出来了,我们刚才说,空队列时,等于rear,现在当队列满时,也是from等于rear,那么如何判断此时的队列究竟是空还是满呢?
办法一是设置一个标志变量flag,当front == rear,且flag = 0时为队列空,当front == rear,且flag= 1时为队列满。
办法二是当队列空时,条件就是from = rear,当队列满时,我们修改其条件,保留一个元素空间。也就是说,队列满时,数组中还有一个空闲单元。 如下图所示,我们就认为此队列已经满了,也就是说,我们不允许上图情况出现。
我们来讨论第二种方法,由于rear可能比front大,也可能比front小,所以尽管它们只相差一个位置时就是满的情况,但也可能是相差整整一圈。所以若队列的最大尺寸为QueueSize,那么队列满的条件是(rear+1) %QueueSize == front (取模“%的目的就是为了整合rear与front大小为一个问题)。
比如上面这个例子, QueueSize = 5,当 front=0,而 rear=4, (4+1) %5 = 0,所以此时队列满。再比如,front = 2而rear =1。(1 + 1) %5 = 2,所以此时 队列也是满的。而对于下图, front = 2而rear= 0, (0+1) %5 = 1,1!=2,所以此时队列并没有满。
另外,当rear > front时,此时队列的长度为rear—front。但当rear < front时,队列长度分为两段,一段是QueueSize-front,另一段是0 + rear,加在一起,队列长度为rear-front + QueueSize,因此通用的计算队列长度公式为:
(rear—front + QueueSize) % QueueSize
有了这些讲解,现在实现循环队列的代码就不难了。具体的例子程序可以参照前面说的顺序队列。
单是顺序存储,若不是循环队列,算法的时间性能是不高的,但循环队列又面临着数组可能会溢出的问题,所以我们还需要研究一下不需要担心队列长度的链式存储结构。
转自点击打开链接
相关文章推荐
- 关于循环队列的一些讲解
- 关于循环队列的一些讲解
- 关于循环队列取模的一些想法
- 请教下关于For循环和mysql的IN查询哪种效率高一些?
- 关于for循环遇到的一些错误
- 文章汇总:关于java的finalize,引用和引用队列,自动释放系统外部资源的一些文章
- 关于TextView的一些初步讲解
- 关于返回Return的一些困惑:”for(){return;}是否退出循环?“
- 关于数组实现队列的一些设计
- 关于Windows CE菜单的一些讲解
- 关于循环语句打印形状的一些思考
- 关于循环语句的一些问题
- 关于ArrayBlockingQueue队列的一些问题
- 关于循环队列的存储问题
- 关于Smail代码的一些简单讲解
- 在网上摘的,留着用吧,关于自定义控件的一些讲解 surfaceview
- 关于firebug的一些讲解
- 体验C#——关于循环语句的一些有趣题目的实现
- L的java学习笔记——关于运算符和循环的一些重点
- 记录一些老外关于Unity3D网络部分的博客讲解