leetcode:循环队列

news2024/11/15 9:54:45

题目描述

题目链接:622. 设计循环队列 - 力扣(LeetCode)

题目分析

我们开辟空间的时候多开一个,k是队列的长度,我们开k+1个空间,定义一个front指向头,back的下一个指向尾

  • 当front==back的时候,队列为空
  • 当(back+1)%(k+)==front的时候,队列为满

这个多开的空间是移动的,出队列的时候front移动,入队列的时候back移动,当队列满的时候,(back+1)%(k+)一定==front

具体过程如下:

具体的接口有下面几个:

创建队列

用结构体封装一个数组,一个front和back,一个长度k来表示队列:

初始化

给队列开辟一块空间,给数组开辟k+1个空间,开始队列为空,front和back都为0

判空

front==back就为空

判满

当(back+1)%(k+)==front的时候,队列为满

插入

如果队列满了直接返回false,如果不为满则插入到back位置,然后back++到后一个位置指向尾的下一个

当back==k+1的时候,back回到数组第一个位置,即back=back%(k+1)

一个数模一个比他大的数不会改变这个值

删除

因为只有front到back之间的值是有效的,所以删除直接让front往后走就行

如果队列空了直接返回false,如果不为空则++front,返回true

同样,当front==k+1的时候,也需要回到数组第一个位置,即front=front%(k+1)

返回队头队尾的值

back指向队尾的下一个,所以返回队尾数据的时候返回的是k-1

如果back指向的是数组第一个,则返回数组的最后一个值,即a[k]

如果队列为空,则返回-1

销毁

队列的有效数据个数

现有一循环队列,其队头为front,队尾为rear(rear指向队尾数据的下一个位置),循环队列长度为N,最多存储N-1个数据,其有效长度为(rear - front + N) % N

有效长度一般是rear-front, 但是循环队列中rear有可能小于front,减完之后可能是负数,所以需要+N,此时结果刚好是队列中有效元素个数,但如果rear大于front,减完之后就是有效元素个数了,再加N后有效长度会超过N,故需要%N。  

代码示例




typedef struct {
    int *a;
    int front;
    int back;
    int k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue* )malloc(sizeof(MyCircularQueue));
    obj->a=(int *)malloc(sizeof(int)*(k+1));
    obj->front=0;
    obj->back=0;
    obj->k=k;
    return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front==obj->back;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->back]=value;
    obj->back++;
    obj->back%=(obj->k+1);
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    ++obj->front;
    obj->front%=(obj->k+1);
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    return obj->a[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    if(obj->back==0)
        return obj->a[obj->k];
    else
        return obj->a[obj->back-1];
}

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

}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

富必达API:一站式无代码开发集成电商平台、CRM和营销系统

一站式无代码开发的连接解决方案 电子商务、客户服务系统以及其它商业应用,是现代企业运营的重要部分。然而,将这些系统进行有效的整合往往需要复杂的API开发,这对很多企业来说是一个巨大的挑战。富必达API以其一站式的无代码开发解决方案&a…

如何做好自动化测试?

提起自动化测试,可谓仁者见人,智者见智,心中五味杂陈啊!你从任何一个招聘渠道来看最近两年对测试岗位的要求,几乎都要求会自动化测试。 而不少人一直认为手工测试才是王道,工作中有的时候也用不到程序&…

Pycharm使用远程服务器运行本地python文件

一、连接远程服务器 路径:Tools → Deployment → Configuration → SFTP → 取名 填写配置信息 二、配置python解释器 三、运行python文件

【JavaEE】线程安全与线程状态

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

“大+小模型”赋能油气行业高质量发展

近日,中国石油石化科技创新大会暨新技术成果展在北京盛大举行,九章云极DataCanvas公司携油气行业一站式AI综合解决方案重磅亮相,充分展示了公司助推油气行业实现AI规模化应用深厚的AI技术实力和领先的AI应用水准,赢得了行业专家和…

AntDB“超融合+流式实时数仓”——打造分布式数据库新纪元

(一) 前言 据统计,在信息化时代的今天,人们一天所接触到的信息量,是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外,人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&a…

外汇天眼交易商评测系列|交易必看,交易小白能选择XM么?

XM是一家成立于2009年提供在线交易经纪商,截至现在已在全球196个国家设立办事处,并向投资者提供30多种语言进行沟通交流。其主要分支机构位于浦路斯,受CySEC监管。现已有约150万交易员和投资者选择XM经纪商所提供的交易产品和服务&#xff0c…

堆栈_删除字符串所有相邻重复项

//给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 // // 在 S 上反复执行重复项删除操作,直到无法继续删除。 // // 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 // // // // 示…

内存函数​(memcpy、memmove、memset、memcmp)

目录 一、memcpy的使用和实现 使用: 模拟实现: 二、memmove 使用和模拟实现 模拟实现: 2.1难点: 覆盖拷贝所在的问题 memset的使用 memcmp的函数的使用​ 一、memcpy的使用和实现 memcpy 拷贝的就是不重叠的内存。 参数…

1.网络编程基础知识 - 基础概念、TCP网络通信、UDP网络通信

网络编程 文章目录 网络编程一、概念1.1 网络1.2 IP地址1.2.1 IPv4 介绍1.2.2 IPv6 介绍1.2.3 查看IP地址 1.3 域名和端口1.4 网络协议1.5 TCP与UDP1.6 InetAddress类1.7 Socket 二、TCP网络通信编程2.1 介绍2.2 案例2.2.1 字节流编程案例12.2.2 字节流编程案例22.2.3 字符流编…

openGauss Summit 2023邀您参会

数据库作为千行万业数据的基石,也是推动数字经济发展的核心。随着数字经济的蓬勃发展,数据库将迎来更加广阔的应用场景和更加迫切的需求。openGauss 社区旨在汇聚产、学、研、用多方力量,聚焦基础软件核心能力的构建,引领国内数据…

东明石化集团领导团队参访震坤行工业超市

东明石化集团领导团队参访震坤行工业超市 10月16日,山东东明石化集团(以下简称东明石化)总裁李治先生一行带队来访参观交流震坤行,与震坤行工业超市董事长兼CEO陈龙、销售负责团队开展座谈。期间,双方就企业数字化转型…

金融网站的技术 SEO:提示和最佳实践

如果你想提高排名,你必须提供高质量的材料,保持你的网站平稳运行,并吸引来自权威网站的联系。但是,作为金融服务供应商,您可能会期望网站访问者和搜索引擎进行更多审查。请记住,你是在要求人们把钱投入你身…

【接口自动化】selenium库也有大用场(获取cookie)

相信有些童鞋在做接口、或者说接口自动化测试的过程中会遇到这样的场景:测试的接口,必须是需要登录后才能发起请求成功的。 那么怎么解决呢? 本着团队协作的精神,我们就去让开发同学开个后门,给你个“万能”值&#x…

Web应用渗透测试完全指南(二)

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

清理docker Build Cache缓存文件

使用docker构建镜像,发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源: docker system df 可以看到已经占用了26.7GB,清理这个缓存 docker builder prune 再次查看,已经没有缓存了,清理成功。 …

Moonbeam生态项目分析 — — DeFi借贷协议Moonwell

流动性激励计划Moonbeam Ignite是帮助用户轻松愉快体验Moonbeam生态的趣味活动。在Moonbeam跨链连接的推动下,DeFi的各种可能性在这里爆发。DeFi或许不热门,但总有机会捡漏,了解Monbeam生态项目,我们邀请Moonbeam大使分享他们的研…

4天肝出一个数据应用,可能吗?| StartDT Hackathon

以「基于SimbaOS Kernel的应用创新」为主题,2023年秋季StartDT Hackathon近日圆满收官。 本季黑客马拉松不仅有多次蝉联冠军的算法团队参战,有过去惜败的队伍卷土重来,还吸引到了制造、政企、泛零售等行业线开发者“攻擂”,携丰富…

数据结构 | 二叉树的概念及前中后序遍历

数据结构 | 二叉树的概念及前中后序遍历 文章目录 数据结构 | 二叉树的概念及前中后序遍历一、树概念及结构1.1 树的相关概念 二、树的表示2.2 树在实际中的运用(表示文件系统的目录树结构) 三、二叉树概念及结构3.1 二叉树的基本概念3.2 二叉树的结构&a…

美林防火建材——朱林甫 坚韧与创新:美林传奇

在这个变幻莫测的时代,有一些创业者凭借着对行业的深刻理解和对未来的敏锐洞察,不仅在商海中乘风破浪,更是引领了整个行业的发展。今天,我们要讲述的,就是一位这样的创业者——来自浙江嘉善的朱总,他创立的…