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

循环队列是逻辑上的环形结构,元素在给定的存储空间中循环存储,解决了顺序队列空间利用率低的问题。队列的判空、判满可以通过不同方式实现,如首尾指针相同判空,尾指针加一等于首指针判满(需对maxsize取余),或者使用额外的length变量或tag参数。文章提供了循环队列长度的计算公式,并附有代码实现及测试结果链接。
摘要由CSDN通过智能技术生成

循环队列定义

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

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

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

循环队列判空、判满

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

第一种方式:
判空:当首尾指针指向同一位置时,队列为空。
判满:当尾指针+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{
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值