2026/4/18 9:13:15
网站建设
项目流程
织梦 5.7网站地图,wordpress主题 外贸网站模板下载,工业软件开发,人与马做的网站#x1f52d; 个人主页#xff1a;散峰而望
《C语言#xff1a;从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》 愿为出海月#xff0c;不做归山云#x1f3ac;博主简介 【算法竞赛】队列和 queue前言1. 队列的概念…个人主页散峰而望《C语言从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》愿为出海月不做归山云博主简介【算法竞赛】队列和 queue前言1. 队列的概念2. 队列的模拟实现2.1 创建2.2 入队2.3 出队2.4 队头2.5 队尾2.6判空2.7元素个数2.8 测试代码3. queue3.1 创建3.2 size / empty3.3 push / pop3.4 front / back3.5 测试代码4. 双端队列5. deque5.1 创建5.2 size / empty5.3 push_front / push_back5.4 front / back5.6 clear5.7 测试代码6. 练习结语前言队列是计算机科学中一种基础且重要的数据结构遵循先进先出FIFO的原则广泛应用于算法竞赛、操作系统调度、网络通信等领域。掌握队列及其变种如双端队列的实现与应用能够帮助解决许多实际问题例如广度优先搜索BFS、滑动窗口优化等。本内容从队列的基本概念出发逐步介绍如何通过数组或链表模拟队列的常见操作包括入队、出队、访问队首队尾等。同时结合 C STL 中的 queue 和 deque 容器对比手动实现的差异展示标准库的高效性与便捷性。最后通过练习题目巩固知识点提升对队列灵活运用的能力。无论是初学者还是有一定经验的选手都能通过本内容系统理解队列的核心思想并熟练应用于竞赛编程中。1. 队列的概念队列也是一种访问受限的线性表它只允许在表的一端进行插入操作在另一端进行删除操作。允许插入的一端称为队尾允许删除的一端称为队头。先进入队列的元素会先出队故队列具有先进先出的特性类似于食堂打饭的特点先排队的人先有饭吃不插队情况下。当队列中没有元素时被称为空队同时元素在队列里进出被称为入队和出队。这就是空队的情况。一头插入一头删除。2. 队列的模拟实现2.1 创建一个足够大的数组充当队列一个变量 h 标记队头元素的前一个位置一个变量 t 标记队尾元素的位置。两个变量(h, t]是一种左开右闭的形式这样设定纯属个人喜好因为后续的代码写着比较舒服。当然也可以 h 标记队头元素的位置。只要能控制住代码不出现 bug想怎么实现就怎么实现。constintN1e610;inth,t;// 队头指针队尾指针intq[N];// 队列2.2 入队将 x 这个元素放入到队列中。注意我们这里依旧从下标为 1 的位置开始存储有效元素。// 入队voidpush(intx){q[t]x;}时间复杂度O(1)2.3 出队即删除头元素。// 出队voidpop(){h;}入队出队代码 bug 都是和顺序表里面讲的一样的【顺序表】一般自己判断一下即可时间复杂度O(1)2.4 队头返回队列里面的第一个元素。// 队头元素intfront(){returnq[h1];}时间复杂度O(1)2.5 队尾返回队列里面的最后一个元素// 队尾元素intback(){returnq[t];}时间复杂度O(1)2.6判空判断队列是否为空。// 队列是否为空boolempty(){returnth;}时间复杂度O(1)2.7元素个数返回队列里面元素的个数。// 队列的大小intsize(){returnt-h;}时间复杂度O(1)2.8 测试代码#includeiostreamusingnamespacestd;constintN1e510;// 创建intq[N],h,t;// 入队voidpush(intx){q[t]x;}// 出队voidpop(){h;}// 查询队头元素intfront(){returnq[h1];}// 查询队尾元素intback(){returnq[t];}// 判断是否为空boolempty(){returnht;}// 有效元素的个数intsize(){returnt-h;}intmain(){// 测试for(inti1;i10;i){push(i);}while(size())// while(!empty()){coutfront() back()endl;pop();}return0;}运行演示结果3. queue依旧注意三点如何创建里面提供了什么函数每个函数的功能以及时间复杂度。3.1 创建queueT q;T 可以是任意类型的数据。3.2 size / emptysize返回队列里实际元素的个数empty返回队列是否为空。时间复杂度O(1)3.3 push / poppush入队pop出队。时间复杂度O(1)3.4 front / backfront返回队头元素但不会删除back返回队尾元素但不会删除。时间复杂度O(1)3.5 测试代码#includeiostream#includequeueusingnamespacestd;typedefpairint,intPII;intmain(){// 测试 queuequeuePIIq;for(inti1;i10;i){q.push({i,i*10});}while(q.size())// while(!q.empty()){autotq.front();q.pop();coutt.first t.secondendl;}return0;}运行演示结果4. 双端队列双端队列也是一种特殊线性结构其允许两端都可以进行数据元素入队和出队操作。将队列的两端分别称为前端和后端两端都可以进行数据入队和出队。5. deque5.1 创建dequeT q;T 可以是任意类型的数据。5.2 size / emptysize返回队列里实际元素的个数empty返回队列是否为空。时间复杂度O(1)5.3 push_front / push_backpush_front头插push_back尾插。时间复杂度O(1)5.4 front / backfront返回队头元素但不会删除back返回队尾元素但不会删除。时间复杂度O(1)5.6 clearclear清空队列。时间复杂度O(N)5.7 测试代码#includeiostream#includedequeusingnamespacestd;structnode{intx,y,z;};intmain(){dequenodeq;// 头插for(inti1;i5;i){q.push_front({i,i*2,i*3});}// 头删while(q.size()){autotq.front();q.pop_front();coutt.x t.y t.zendl;}// 尾插for(inti1;i5;i){q.push_back({i,i*2,i*3});}// 尾删while(q.size()){autotq.back();q.pop_back();coutt.x t.y t.zendl;}return0;}运行演示结果6. 练习队列海港结语队列作为基础数据结构遵循先进先出FIFO原则在广度优先搜索BFS、任务调度等场景中广泛应用。通过模拟实现和标准库 queue 的对比可以更深入理解其核心操作入队、出队、访问队首/队尾的底层逻辑。愿诸君能一起共渡重重浪终见缛彩遥分地繁光远缀天。