数据结构中的环形队列

文章来源:https://mp.weixin.qq.com/s/HMQJ3ZF2wy8IFkSRTu1naQ

管理环形队列的一个难点就是如何判断队空和队满的条件。在教科书中我们一般采用3种方法来判断,下面先简要介绍这三种方法,然后再看一种比较灵活的改进方法。

先定义环形队列的数据结构:

#define MAXSIZE 1024 //顺序队列的最大容量
typedef int QElemType; //定义队列中元素类型,可调整
typedef  struct { 
  QElemType data[MAXSIZE]; //数据的存储区
  int front,rear; //队头、队尾指针
  int num; //队中元素的个数
}SeqQ; //环形队列
SeqQ *Q;

方法1:增加一个变量num,记录队列中的元素个数,当num等于0时表示队空,当num等于MAXSIZE时,表示队满。这是一种常用的方法。

方法2:少用一个元素空间,即队列大小为MAXSIZE个单元,仅用MAXSIZE-1个单元存放数据,rear指向的单元总是空白的,当Q->front等于Q->rear时,表明队空;当(Q->rear+1)%MAXSIZE==Q->front时,表示队满。队满时,存放的元素个数为MAXSIZE-1个。

方法3:队的基本操作是入队和出队,使队列变为空的最后操作是出队,使队列变为满的最后操作是入队,设置一个标志变量flag,初值为0,当入队成功时,设置flag为1,指示队列操作成功的最后操作为入队;当出队成功时,设置flag为0,指示队列操作成功的最后操作为出队。队空时条件为Q->front==Q->rear && !Q->flag;队满时条件为Q->front==Q->rear &&  Q->flag。

下面介绍一种比较巧妙的方法,来源于vx6源代码。数据结构定义如下:

#define BUF_SIZE 32
int buf[BUF_SIZE];
uint64 buf_w;
uint64 buf_r;

入队操作:

void en_queue(int c)
{
    if(buf_w == buf_r + BUF_SIZE){
      printf("queue is full\n");
      exit(1);
    } 
    buf[buf_w % BUF_SIZE] = c;
    buf_w += 1;    
}

出队操作:

int de_queue( )
{
    if(buf_w == buf_r){
      printf("queue is empty\n");
      exit(2);
    } 
    int c = buf[buf_r % BUF_SIZE];
    buf_r += 1;    
    return c;
}

在出队时,判断环形队列是否为空,如果读写指针相同,那么说明环形队列是空,出队失败。在入队时,如果写指针等于读指针加BUF_SIZE,那么说明环形队列满了。这里的巧妙之处就是定义读写指针为无符号整型数,它们的值一直递增直到绕回,再重新递增。用这种方法管理环形队列更加简单易用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhw---9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值