数据结构第九弹---循环队列

这篇具有很好参考价值的文章主要介绍了数据结构第九弹---循环队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、循环队列的定义

顺序队列在使用过程中容易出现虚假的满状态, 为了解决这个问题,就产生了一个较巧妙的方法,将顺序队列臆造为一个环状的空间,称之为循环队列。循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。但是循环队列中存在一个问题,在循环队列中只凭头指针front等于尾指针rear无法判别队列空间是“空”还是“满”,可有两种处理方法:其一是另设一个标志位以区别队列是“空”还是“满”;其二是少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置(指环状的下一位置)上”作为队列呈“满”状态的标志。此处使用方法二来解决这个问题。

2、循环队列的结构

数据结构第九弹---循环队列,数据结构,c语言,算法

数据结构第九弹---循环队列,数据结构,c语言,算法

typedef struct CircularQueue{
    int* a;//存放数据数组
    int front;//头结点
    int back;//尾结点后一个,有效数据个数
    int k;//元素个数
} CircularQueue;

3、循环队列的实现

3.1、初始化队列

开辟k+1个空间,k个存放数据,将头尾结点初始化为0,即数组的第一个位置。

数据结构第九弹---循环队列,数据结构,c语言,算法
代码实现

//队列初始化
CircularQueue* InitQueue(int k)
{
     CircularQueue* obj=(CircularQueue*)malloc(sizeof(CircularQueue));//为队列分配空间
     obj->a=(int*)malloc(sizeof(int)*(k+1));
     obj->front=obj->back=0;//初始队列为空,头尾指针都指向0的位置
     obj->k=k;
     return obj;
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.2、判断是否为空

根据结构定义,头结点跟尾结点相等时则队列为空。为真则为空,为假则不为空。

代码实现

bool QueueEmpty(CircularQueue* obj) {
    return obj->front==obj->back;//头尾结点相等时则为空
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.3、判断是否为满

根据循环队列结构的定义,尾结点后一个是头结点则队列为满。为真则为满,不为真则不满。

数据结构第九弹---循环队列,数据结构,c语言,算法
代码实现


bool QueueFull(CircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;//尾结点的下一个等于头结点则为满
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.4、入队

根据队列的结构定义,back为尾结点的后一个,当队列空间没有满时,插入数据时则在back位置插入。
数据结构第九弹---循环队列,数据结构,c语言,算法
代码实现


bool EnQueue(CircularQueue* obj, int value) {
    //满了返回false
    if(QueueFull(obj))
    {
        return false;
    }
    obj->a[obj->back]=value;//插入有效数据
    obj->back++;
    obj->back%=(obj->k+1);//进入循环,不能超过最大个数
    
    return true;
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.5、出队

根据队列的定义,只能队头出数据,在循环队列里面通过头尾结点来访问数据,将front++即可删除头结点数据。

数据结构第九弹---循环队列,数据结构,c语言,算法
代码实现


bool DeQueue(CircularQueue* obj) {
    //如果为空返回false
    if(QueueEmpty(obj))
    {
        return false;
    }
    obj->front++;//出队则头结点往前走
    obj->front%=(obj->k+1);
    return true;
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.6、返回队头元素

在保证队列不是空的情况下,队头元素为front下标的元素,为空则返回-1

代码实现


int QueueFront(CircularQueue* obj) {
    //为空返回-1
    if(QueueEmpty(obj))
            return -1;
    return obj->a[obj->front];
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.7、返回队尾元素

在保证队列不是空的情况下,队头元素为back前一个下标的元素,为空则返回-1

数据结构第九弹---循环队列,数据结构,c语言,算法
代码实现

int QueueRear(CircularQueue* obj) {
     //为空返回-1
    if(QueueEmpty(obj))
            return -1;

    //有一种特殊情况 不是back-1
    //1.
    //return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
    return obj->a[(obj->back+obj->k)%(obj->k+1)];

    //2.
    // if(obj->back==0)
    // {
    //     return obj->a[obj->k];
    // }
    // else
    // {
    //     return obj->a[obj->back-1];
    // }
}

测试
数据结构第九弹---循环队列,数据结构,c语言,算法

3.8、销毁队列

数组是通过队列的指针访问,且数组和队列都是内存是连续的,可以直接释放内存,所以先释放数组,在释放队列

void QueueFree(CircularQueue* obj) {
    free(obj->a);//释放数组
    free(obj);//释放队列
}

4、代码汇总

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int QDataType;
//结构定义
typedef struct CircularQueue{
    QDataType* a;//存放数据数组
    int front;//头结点
    int back;//尾结点后一个,有效数据个数
    int k;//元素个数
} CircularQueue;
//初始化
CircularQueue* InitQueue(int k)
{
     CircularQueue* obj=(CircularQueue*)malloc(sizeof(CircularQueue));//为队列分配空间
     obj->a=(int*)malloc(sizeof(int)*(k+1));
     obj->front=obj->back=0;//初始队列为空,头尾指针都指向0的位置
     obj->k=k;
     return obj;
}
//判断是否为空
bool QueueEmpty(CircularQueue* obj) {
    return obj->front==obj->back;//头尾结点相等时则为空
}
//判断是否为满
bool QueueFull(CircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;//尾结点的下一个等于头结点则为满
}
//入队
bool EnQueue(CircularQueue* obj, int value) {
    //满了返回false
    if(QueueFull(obj))
    {
        return false;
    }
    obj->a[obj->back]=value;//插入有效数据
    obj->back++;
    obj->back%=(obj->k+1);//进入循环,不能超过最大个数
    
    return true;
}
//出队
bool DeQueue(CircularQueue* obj) {
    //如果为空返回false
    if(QueueEmpty(obj))
    {
        return false;
    }
    obj->front++;//出队则头结点往前走
    obj->front%=(obj->k+1);
    return true;
}
//获取队头元素
int QueueFront(CircularQueue* obj) {
    //为空返回-1
    if(QueueEmpty(obj))
            return -1;
    return obj->a[obj->front];
}
//获取队尾元素
int QueueRear(CircularQueue* obj) {
     //为空返回-1
    if(QueueEmpty(obj))
            return -1;

    //有一种特殊情况 不是back-1
    //1.
    //return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
    return obj->a[(obj->back+obj->k)%(obj->k+1)];

    //2.
    // if(obj->back==0)
    // {
    //     return obj->a[obj->k];
    // }
    // else
    // {
    //     return obj->a[obj->back-1];
    // }
}
//销毁
void QueueFree(CircularQueue* obj) {
    free(obj->a);
    free(obj);
}

循环队列OJ链接
循环队列

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!文章来源地址https://www.toymoban.com/news/detail-793030.html

到了这里,关于数据结构第九弹---循环队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据结构--队列与循环队列

    数据结构--队列与循环队列

            队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子:  图1         如图1,1号元素是最先进的,开始出队时,那么他就是最先出的,然后12进队,就应该排在最

    2024年02月10日
    浏览(9)
  • 数据结构—循环队列(环形队列)

    数据结构—循环队列(环形队列)

    循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且 队尾被连接在队首之后以形成一个循环 。它也被称为“ 环形缓冲器 ”。 循环队列的一个好处是可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素

    2024年02月11日
    浏览(8)
  • 【数据结构和算法】--队列的特殊结构-循环队列

    【数据结构和算法】--队列的特殊结构-循环队列

    循环队列是队列的一种特殊结构,它的 长度是固定的 k ,同样是 先进先出 ,理论结构是 首尾相连的环形循环结构 。其理论结构大致如下: 具体结构描述可以参考 LeetCode : 622. 设计循环队列的题目要求,大致如下: 设计你的循环队列实现。 循环队列是一种 线性数据结构 ,

    2024年02月04日
    浏览(10)
  • 数据结构:循环队列的实现(leetcode622.设计循环队列)

    数据结构:循环队列的实现(leetcode622.设计循环队列)

      目录 一.循环队列简单介绍 二.用静态数组实现循环队列 1.数组循环队列结构设计 2.数组循环队列的堆区内存申请接口  3.数据出队和入队的接口实现 4.其他操作接口 5.数组循环队列的实现代码总览  三.静态单向循环链表实现循环队列  1.链表循环队列的结构设计 2.创建静态

    2024年02月03日
    浏览(9)
  • 数据结构——循环队列详解

    数据结构——循环队列详解

    目录 一、循环队列的定义 二、 循环队列的基本操作 三、循环队列的实现  1、循环队列的定义 2、循环队列的初始化  3、循环队列出队  4、循环队列入队  5、队列判空 6、 队列判满 7、取队头元素 8、输出队列  9、求队列长度  四、完整代码  五、小结  六、参考文献 一、

    2024年02月04日
    浏览(10)
  • 数据结构--循环队列、链队

    //循环队列数据结构 typedef struct { QElemType data[MaxQSize];//数据域 int front,rear; //队头队尾指针 }SqQueue; //链队结点数据结构 typedef struct QNode { int data;//数据域 struct QNode* next;//指针域 }QNode, * QueuePtr; typedef struct { struct QNode* front, * rear;//rear指针指向队尾 用于入队 front指针指向队头 用于

    2024年02月15日
    浏览(18)
  • 【数据结构】循环队列

    【数据结构】循环队列

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月12日
    浏览(13)
  • 数据结构——循环队列的实现

    数据结构——循环队列的实现

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信

    2024年03月24日
    浏览(9)
  • 九、数据结构——顺序队列中的循环队列

    九、数据结构——顺序队列中的循环队列

    一、循环队列的定义 二、循环队列的实现 三、循环队列的基本操作 ①初始化 ②判空 ③判满 ④入队 ⑤出队 ⑥获取长度 ⑦打印 四、循环队列的应用 五、全部代码 在数据结构中,队列(Queue)是一种常见的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。循环队

    2024年02月15日
    浏览(14)
  • 【数据结构与算法】设计循环队列

    【数据结构与算法】设计循环队列

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言阶段(已结束) ❤️ 数据结构与算法(ing) ❤

    2024年01月17日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包