循环队列(即顺序存储的队列,元素循环存储)

循环队列定义

在逻辑上把顺序存储的队列想象成一个环,就是循环队列。
循环队列仍是顺序存储,只是元素可以循环存储在给定的存储空间。

前篇文章,顺序存储队列基本操作 所描述的队列的存储空间只可以使用一次,在一些元素出队之后,空出来的空间没有办法再次存储,造成浪费,所以更多选择循环队列。

两者的内存中的存储一样,只是逻辑上将两者分为了非循环和循环。

循环队列判空、判满

判空和判满可以有多种方式,根据自己的设计选择即可。

第一种方式:
判空:当首尾指针指向同一位置时,队列为空。
判满:当尾指针+1 = 首指针,队列已满。
(这种方式是牺牲一个存储空间来判断队列是否已满)
注意:判满时 需要对maxsize取余,否则rear可能超出maxsize。

第二种方式:
单独设置一个length变量,来存储队列的长度
判空:length = 0
判满:length = maxsize

前篇文章,顺序存储队列基本操作 就是利用length判断长度

第三种方式
设置一个tag参数 tag=1 时队满;tag= 0 时对空。
判空:当首尾指针指向同一位置时,队列为空。
判满:tag=1 时队满;tag= 0 时对空。

循环队列长度

length = (rear + maxsize - front)%maxsize;

代码实现

/**
 * 循环队列的基本操作
 */
#include <cstdio>

#define maxsize 6  //定义队列中元素的最大个数
/**
 * 定义结构
 */
typedef struct {
   
    int data[maxsize];  //存放队列元素
    int front,rear;     //对头指针和队尾指针   数组下标也可以表示指针,可以不加*
}SqQueue;

/**
 * 初始化队列,构造一个空的队列
 */
void initQueue(SqQueue &Q){
   
    Q.front = Q.rear = 0;   //初始化队首队尾指针,构建空的队列
}
/**
 * 判断队列是否为空
 */
bool QueueIsEmpty(SqQueue Q){
   
    if(Q.front == Q.rear){
     //队列为空
        printf("队列为空 \n");
        return true;
    }else{
   
        
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值