循环队列简介

背景

循环队列的出现是为了克服普通队列存在“假溢出”的现象,将存储空间想象成一个首位相接的圆环,当写指针写到末尾后重新从首部写入。由于存储空间有限,当设计循环队列时,需要考虑队满的情况,通常循环队列在队满时都是丢弃新数据,不再写入,但对于比如像实时信号采集系统,就需要覆盖旧数据,所以在设计时首先应该考虑该循环队列队满时是丢弃新数据还是覆盖旧数据,另外,对于丢弃新数据,通常也有三种实现方式,包括引入flag标记法、牺牲一个存储单元法和引入数据元素计数法。循环队列通用操作如下:
在这里插入图片描述

下面以C++模板方式简单对4种方式进行介绍。

队满时覆盖旧数据

该方法引入一个标志成员flag,当写指针追上读指针时,flag置为true,每次读数据后,都将flag置为false,通过flag状态来判断队空还是队满,注意,每次当flag置为true时,都应该修改读指针位置,因为是覆盖旧数据,所以应该移动读指针到写指针位置。在这里插入图片描述
在这里插入图片描述

丢弃新数据—flag标记法

如果队列设计为丢弃新数据,即写指针最大位置是经过队列长度后重新和读指针重合,结果就导致队满和队空都是Front == Rear。通过引入一个flag标记,当写入有效数据后设置flag为true,读取有效数据后设置flag为false,这样在判别队满或对空时,如果flag为true,则为队满,如果flag为false,则为队空。在这里插入图片描述

丢弃新数据—牺牲存储单元法

在初始化循环队列大小后,主动牺牲最后一个存储单元,即最后一个存储单元不存放数据。所以队满条件为:(Rear+1)% QueueSize == Front;队空条件还是Rear == Front;

丢弃新数据—引入数据元素计数法

更简单的方式是引入一个成员专门用于统计有效元素的个数,每写入一个有效数据元素,即+1,没读取一个有效数据,即-1.通过该成员来判断队满或队空。

源码打包下载链接(以模板继承方式实现)

下载链接请点击此处

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值