leetcode 622.设计循环队列

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

⭐️ 题目描述

leetcode 622.设计循环队列,刷题,leetcode,学习,刷题,循环队列


🌟 leetcode链接:设计循环队列

1️⃣ 思路与图解: 首先循环队列是一个固定长度的队列,如果用链表的实现的话,当队列需要取队尾的数据,则需要遍历找到尾的前一个,所以循环队列比较优的方案是用数组来实现。 又引出的问题是,如果当数据为空那么 head 指针和 tail 都应该在 0 下标处,那当数据满了 tailhead 指针也指向同一个下标。此时我们就不方便区分循环队列是满还是空,所以我们开辟 k + 1 个空间的大小,这样的话,当为空的时候 head == tail ,当满的时候 tail + 1 == head,我们多开辟一个数据大小的空间来解决这里的问题。

leetcode 622.设计循环队列,刷题,leetcode,学习,刷题,循环队列


leetcode 622.设计循环队列,刷题,leetcode,学习,刷题,循环队列


leetcode 622.设计循环队列,刷题,leetcode,学习,刷题,循环队列


leetcode 622.设计循环队列,刷题,leetcode,学习,刷题,循环队列


代码:文章来源地址https://www.toymoban.com/news/detail-549984.html

typedef struct {
    int * data;
    int k;
    int head;
    int tail
} MyCircularQueue;

// 函数声明
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    // 开辟k + 1个空间 方便判断循环队列是否满或空
    cq->data = (int*)malloc(sizeof(int) * (k + 1));
    cq->k = k;
    cq->head = 0;
    cq->tail = 0;

    return cq;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    // 如果循环队列已满 则插入失败
    if (myCircularQueueIsFull(obj))
        return false;

    // 插入
    obj->data[obj->tail] = value;
    // 检查边界
    if (++obj->tail == obj->k + 1) {
        obj->tail = 0;
    }

    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    // 如果队列为空 删除失败
    if (myCircularQueueIsEmpty(obj))
        return false;
    

    // 检查边界
    if (++obj->head == obj->k + 1) {
        obj->head = 0;
    }

    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    // 如果队列为空 取数据失败
    if (myCircularQueueIsEmpty(obj))
        return -1;

    return obj->data[obj->head];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    // 如果队列为空 取数据失败
    if (myCircularQueueIsEmpty(obj))
        return -1;

    int res = obj->tail - 1 == -1 ? obj->k : obj->tail - 1;

    return obj->data[res];
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->head == obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    // 判断边界
    int res = obj->tail + 1 ==  obj->k + 1 ? 0 : obj->tail + 1;

    return res == obj->head;
}

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->data);
    free(obj);
}

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

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

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

相关文章

  • 622. 设计循环队列(中等系列)

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

    2024年02月11日
    浏览(25)
  • 力扣622:设计循环队列(中等)

    目录 思考 一,循环队列的初始化myCircularQueueCreate 二,判断是否为空myCircularQueueIsEmpty 三,判断队列是否满了bool myCircularQueueIsFull 四,队列的插入myCircularQueueEnQueue 五,队列的删除myCircularQueueDeQueue 六,队列取头元素和尾元素myCircularQueueFront   //   myCircularQueueRear 七,销毁队列

    2024年03月13日
    浏览(29)
  • 数据结构刷题训练:设计循环队列(力扣OJ)

    目录 文章目录 前言 1. 题目:设计循环队列 2. 思路 3. 分析  3.1 定义循环队列  3.2 创建队列  3.3 判空和判满  3.4 入队  3.5 出队  3.6 取队头队尾数据  3.7 销毁队列  4. 题解 总结         当谈到队列数据结构时,很多人可能会想到普通的队列,即先进先出(FIFO)的数据结

    2024年02月13日
    浏览(35)
  • leetcode——设计循环队列

    设计循环队列 这个题目在这里小编只分享一个解题思路,因为还有一个思路小编还在尝试,一直过不了,还在这里不断尝试,等我试出来的时候我在分享给大家,首先我们在这里给出的是数组的形式,后面在分享单链表的思路,因为数组在内存上是连续的,这里给出的思路是

    2024年02月05日
    浏览(25)
  • 【数据结构】如何设计循环队列?图文解析(LeetCode)

    LeetCode链接:622. 设计循环队列 - 力扣(LeetCode) 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元素 9. 销毁队列 全部代码 设计循环队列,使用数组或链表

    2024年02月10日
    浏览(30)
  • leetcode 622. 设计循环链表

    这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助 (最好在VS自己测试一遍,再放到 leetcode上哦) 下面的是主函数(作参考),静下心来慢慢测试 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先

    2024年02月05日
    浏览(25)
  • leetcode分类刷题:队列(Queue)(一、单调队列)

    单调队列,看起来是与单调栈对应起来的一样;但是做题的时候感觉单调队列不像单调栈一样,能根据题意自然形成 单调队列的基本实现 ,感觉单调队列更像是和某个队列对应起来的一样 1、 单调队列的经典题型 :使用双向队列维护窗口,窗口移动的元素增删与队列的先进

    2024年02月09日
    浏览(30)
  • Leetcode循环队列

    这道题十分考验我们对队列的理解。 队列的介绍   队列是一种只允许在一段进行插入,在另一端进行删除的数据操作的特殊线性结构,,因此决定了他具有先入先出的特点,其中进行插入操作的一段叫做队尾,出队列的一端叫做队头。 队列的实现   队列可以使用链表或者

    2024年02月06日
    浏览(26)
  • leetcode 力扣刷题 旋转矩阵(循环过程边界控制)

    下面的题目的主要考察点都是,二维数组从左上角开始顺时针(或者逆时针)按圈遍历数组的过程。顺时针按圈遍历的过程如下: 对于每一圈,分为四条边 ,循环遍历就好。这时,对于 四个角 的元素的处理,可以将四条边的遍历分为以下两种情况: 第一种:每条边都从对

    2024年02月12日
    浏览(36)
  • 【C语言】【LeetCode】循环队列

    目录  (一)题目描述 (二)数据结构的选择 (三)函数接口的分析实现  正文开始:         题目链接:622. 设计循环队列         设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循

    2024年03月15日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包