关于顺序存储结构队列

来源:互联网 发布:php 电商 编辑:程序博客网 时间:2024/04/29 07:07
  队列是一种先进先出的线性表(FIFO),出队列的那一端叫做队头,入队列的那一端叫做队尾。作为线性表,同样也有各种端口操作,不同的是插入数据只能在队尾进行,删除数据只能在队头进行。
  同栈,队列也有两存储方式,先来看看顺序队列。顺序队列入队方式很简单,就是在队尾追加一个元素,不需要移动任何元素。而出队方式就只能从队头出列,假如有一个队列为a0,a1,a2,a3,下标分别为0,1,2,3,当出队时,a0出队,其余的三个元素向前移动,保证下标为0的位置不为空,和线性表的顺序存储结构完全相同。为了减少出队的时间复杂度,我们去掉队列元素必须存储在数组的前n个单元这个条件。为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列就为空队列,即没有元素。而在插入元素时front指针不动,rear指针向后移动,元素出队时,rear不动,front向后移动,如果不停插入再出队再插入最终会时rear指针指向界外,产生溢出,而前面front移动过的位置还是空的,我们称这为“假溢出”。为了解决这个问题,我们把队列的头和尾相连起来,就是头尾相接的循环队列。当这样又有一个问题,不停的插入元素当rear循环一圈后又与front碰头了怎么办?我们这里给它设置一个flag,当front == rear 并且flag = 0时队列为空,当front == rear 且flag = 时,队列为满。还有一张办法就是当队列为空时,条件就是front == rear,当队列满时我们保留一个元素空间,也就是说队列元素和队列空间差一个单元。而队列满时rear与front直接可能差一个元素空间或者差一圈,所以我们判断队列满的条件就是(rear + 1) % QueueSize == front ,这样就能确定队列是否为满,QueueSize 为队列的最大尺寸,也就是容量。而队列的通用长度计算公式为:(rear - front + QueueSize)% QueueSize。
  循环队列的顺序存储结构的操作代码如下:
  
  循环队列的初始化:


  循环队列的入队列:


  循环队列的出队列:


  只要是顺序存储结构它的大小必定受到限制,所以对于不受大小限制的结构我们都用链式结构,下次再来介绍链式结构队列的知识吧。
原创粉丝点击