【算法通关指南:数据结构和算法篇】算法里的 “排队系统”:队列的数组模拟 + STL queue 实战

【算法通关指南:数据结构和算法篇】算法里的 “排队系统”:队列的数组模拟 + STL queue 实战
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力
ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、队列的概念

队列也是⼀种访问受限的线性表,它只允许在表的⼀端进行插入操作,在另⼀端进行删除操作。
• 允许插入的⼀端称为队尾,允许删除的⼀端称为队头。
• 先进入队列的元素会先出队,故队列具有先进先出(FirstInFirstOut)的特性。

二、队列的模拟实现

2.1创建

• 一个足够大的数组充当队列;
• 一个变量h 标记队头元素的前⼀个位置
• 一个变量t标记队尾元素的位置。两个变量(h, t] 是⼀种左开右闭的形式,这样设定纯属个人喜好,因为后续的代码写着比较舒服。,也以h标记队头元素的位置。只要能控制住代码不出现bug ,想怎么实现就怎么实现。

在这里插入图片描述
constint N =1e6+10;int h, t;// 队头指针,队尾指针int q[N];// 队列

2.2 入队

注意:我们依旧从下标为1的位置开始存储有效元素

在这里插入图片描述
// ⼊队voidpush(int x){ q[++t]= x;}

时间复杂度:O(1)

2.3出队

在这里插入图片描述
// 出队voidpop(){ h++;;}

时间复杂度:O(1)

2.4队头

注意:不是h所指的位置,而是h所指的下⼀个位置

在这里插入图片描述
// 队头元素intfront(){return q[h +1];}

时间复杂度:O(1)

2.5队尾

在这里插入图片描述
// 队尾元素intback(){return q[t];}

时间复杂度:O(1)

2.6判空

在这里插入图片描述
// 队列是否为空 bool empty(){return t == h;}

时间复杂度:O(1)

2.7有效元素个数

在这里插入图片描述
// 队列的大小intsize(){return t - h;}

时间复杂度:O(1)

2.8 所有测试代码

#include<iostream> using namespace std;constint N =1e6+10;int h, t;// 队头指针,队尾指针int q[N];// 队列// ⼊队voidpush(int x){ q[++t]= x;}// 出队voidpop(){ h++;;}// 队头元素intfront(){return q[h +1];}// 队尾元素intback(){return q[t];}// 队列是否为空 bool empty(){return t == h;}// 队列的大小intsize(){return t - h;}intmain(){// 测试for(int i =1; i <=10; i++){push(i);}while(size())// while(!empty()){ cout <<front()<<" "<<back()<< endl;pop();}return0;}

运行结果:

在这里插入图片描述

三、queue

(1)如何创建?
(2)里面提供了什么函数接口?
(3) 每个函数的功能以及时间复杂度

3.1 如何创建

queue<T> q; T :可以是任意类型的数据。 

3.2容器相关接口

3.2.1 size / empty

(1) size :返回队列⾥实际元素的个数;
(2) empty :返回队列是否为空。

时间复杂度:O(1)

3.2.2 push / pop

(1) push :入队;
(2)pop:出队。

时间复杂度:O(1)

3.2.3 front / back

(1) front :返回队头元素,但不会删除
(2) b ack :返回队尾元素,但不会删除
时间复杂度: O(1)

3.3测试所有接口

#include<iostream>#include<queue> using namespace std;typedef pair<int,int> PII;intmain(){// 测试queue queue<PII> q;for(int i =1; i <=10; i++){ q.push({ i, i *10});}while(q.size())// while(!q.empty()){auto t = q.front(); q.pop(); cout << t.first <<" "<< t.second << endl;}return0;}

运行结果:

在这里插入图片描述

总结与每日励志时刻

本文介绍了队列的概念、实现方法和STL中的queue容器。队列是一种先进先出(FIFO)的线性数据结构,文章详细讲解了如何用数组模拟实现队列,包括入队、出队、获取队头/队尾元素、判空和计算元素个数等操作。同时,文章也介绍了C++标准库queue容器的基本用法和接口函数。队列在算法竞赛中应用广泛,主要关注时间效率,通常采用数组实现。文章还提供了完整的测试代码和运行结果,帮助读者理解队列的实现原理和使用方法。

在这里插入图片描述

Read more

2025最新版 Go语言&Goland 专业安装及配置(超详细)

2025最新版 Go语言&Goland 专业安装及配置(超详细)

目录 * 一、安装Go语言 (Golang) * 1. 下载安装 * 2. 配置环境变量 * 3. 安装验证 * 二、安装Goland IDE * 1. 下载安装 * 2. 首次配置 * 3.创建项目验证 一、安装Go语言 (Golang) 1. 下载安装 * 一直NEXT Finish 修改安装路径 在Golang官网下载(Windows版) 2. 配置环境变量 * 计算机(右键)→属性→高级系统设置→(点击)环境变量 PATH:go的bin目录,通常安装golang后,系统会自动配置 检查一下 GOPATH:自定义一个工作区目录(存放代码、依赖库等) 新建一个系统变量 检查GOPATH用户变量(要与上面的系统变量一致) GOROOT:

By Ne0inhk
黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

简历上展示黑马点评 完整代码地址 微服务学成在线项目 前言 当初就是当作一个学习笔记和个人面试记录发的,没想到这么多人收藏浏览,还是感慨学Java的人确实多啊。 适合什么人看呢,我仅仅说说我个人的理解,因为我现在也是个经历秋招的双非学生。 1.初学者学习完Redis基础,想来个实战,黑马点评还是特别好的一个项目,基本包含了所有数据类型的运用和redis其他功能的扩展,这篇文章可以带你提炼重点,很好的走下流程。 2.但大部分人是冲着找实习和秋招去的,像我这种学历不高的秋招就不要写黑马点评了,即使包装,也会很容易看出来,我找实习的时候就被面试官问到这是不是黑马点评过,我们可以把其中的闪光点迁移到你找的其他项目中,比如缓存穿透雪崩击穿的解决方法,redisson分布式锁解决一人一单,这种在大多项目中都可以添加,自圆其说就行。 3.对于找实习的像大二,大三上的,想找个小厂试试手垂直向上升的,可以吃透它,面试官问你遇到的困难或者是你觉得难点,就可以重点讲一人一单这个解决方法和流程,越详细越好。 4.前提是大家不用直接用这套模板,太多人用了,这也是我从网上找的别人的,巧用AI让它改改项

By Ne0inhk
Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及海量离线资源标识、蓝牙广播载荷(BLE Payload)及二维码数据极限压缩的背景下,如何生成既能保留 UUID 强随机性、又能极大缩减字符长度的唯一标识符,已成为优化存储与通讯效率的“空间必修课”。在鸿蒙设备这类强调分布式软总线传输与每一字节功耗敏感的环境下,如果应用依然直接传输长度达 36 字符的标准 UUID,由于由于有效载荷溢出,极易由于由于传输协议限制导致数据截断或多次分包带来的延迟。 我们需要一种能够实现高进制转换、支持双向编解码且具备低碰撞概率的短 ID 生成方案。 short_uuids 为 Flutter 开发者引入了将标准 UUID 转化为短格式字符串的高性能算法。它利用

By Ne0inhk
爬虫使用代理IP全解析:原理、类型与实战指南

爬虫使用代理IP全解析:原理、类型与实战指南

代理IP是爬虫系统中保障连接稳定性与提升数据采集效率的重要技术组件。在实际开发过程中,很多人都会疑问:代理IP到底是如何工作的?在Python爬虫项目中又该如何正确配置?本文将围绕代理IP的通信原理、常见类型差异以及具体代码实现方式进行系统解析,帮助你更清晰地理解其在爬虫架构中的作用。 代理IP的基本原理是什么? 从网络通信结构来看,普通请求流程是: 本地服务器 → 目标服务器 → 返回数据 当引入代理IP后,请求路径变为: 本地服务器 → 代理服务器 → 目标服务器 → 代理服务器 → 本地服务器 代理服务器相当于一个“中转节点”。它在客户端与目标服务器之间建立连接,并转发请求与响应数据。 常见代理IP类型 在爬虫系统中,常见代理IP类型主要分为动态IP与静态IP。 对比维度动态IP静态IPIP变化频率每次请求或定期更换长时间固定适用场景高频采集任务长周期数据同步管理难度较低需要稳定维护并发扩展性更强相对稳定 动态IP更适用于高频、大规模数据采集任务;而静态IP则适用于持续连接型的数据交互需求。 选择哪种类型,并没有绝对标准,而是取决于采集频率、并发

By Ne0inhk