IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode之C语言实现循环队列 -> 正文阅读

[数据结构与算法]Leetcode之C语言实现循环队列

前言

这是一道Leetcode中一道中等难度的队列题,题名622. 设计循环队列
题目要求:
在这里插入图片描述

一、什么是循环队列

循环队列(CircularQueue)就是首位相接的队列,有基于数组实现,也有基于链表实现,一般特指基于数组实现的循环队列。在数组的循环队列中,其出队的时间复杂的明显要优于普通的数组队列。其本质上则是通过两个指针,队首指针与队尾指针来实现。这种结构的优势就是开辟有限的空间,却能够反复使用开辟的空间,提高了内存利用率。

二、循环队列的实现

循环队列可以使用链表来实现,但一般采用数组来实现循环队列,下面我也将会采用数组来实现循环队列。
先举个例子,假设这个队列最大存储数据的个数为X,那么我们应该创建一个容量为**(X+1)大小的队列。这样做的好处是为了方便我们对队列判空判满更加方便。
如图:
在这里插入图片描述从图中不难看出,其判断一个循环队列是否为满的
条件就是**(tail+1)%(X+1)==head.
让我们再看看判空的条件又是那些,如图:
在这里插入图片描述队列判空条件就是:head等于tail的时候。
现在我们就直接上具体实现的代码:

typedef struct {
    int* a;//数组
    int k;//容量个数
    int head;//队头
    int tail;//队尾
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k)//循环队列初始化
 {
    MyCircularQueue* newnode = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    newnode->k = k;
    newnode->head = 0;
    newnode->tail = 0;
    newnode->a = (int*)malloc(sizeof(int)*(1+k));//申请空间K+1   
    return newnode;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)//插入数据
 {
   if(!myCircularQueueIsFull(obj))//队列不为满则插入数据
   {
       obj->a[obj->tail] = value;
       obj->tail = (obj->tail+1)%(obj->k+1);
       return true;
   }
   return false;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj)//头删数据
 {
    if(myCircularQueueIsEmpty(obj))//队列不为空才能删除数据
    {
        return false;
    }
    obj->head = (obj->head +1)%(obj->k+1);
    return true;
}
int myCircularQueueFront(MyCircularQueue* obj)//返回队头数据
{
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->a[obj->head];
}

int myCircularQueueRear(MyCircularQueue* obj)//返回队尾数据
{
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    if(obj->tail==0)
    {
        return obj->a[obj->k];
    }
    return obj->a[obj->tail-1];
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj)//判断队列是否为空 
{

    if(obj->tail == obj->head)
    return true;
    return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj)//判断队列是否为满
 {
        if((obj->tail+1)%(obj->k+1)==obj->head)
        {
            return true;
        }
        else if(obj->tail==obj->k &&obj->head==0)
        {
            return true;
        }
        else
        {
            return false;
        }
}

void myCircularQueueFree(MyCircularQueue* obj)//回收空间
 {
    free(obj->a);
    free(obj);
}

总结

以上就是用C语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:50:35  更:2022-03-30 18:50:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:40:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码