news 2026/10/15 23:50:52

【算法竞赛】队列和 queue

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法竞赛】队列和 queue

🔭个人主页:散峰而望

《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》

愿为出海月,不做归山云

🎬博主简介

【算法竞赛】队列和 queue

  • 前言
  • 1. 队列的概念
  • 2. 队列的模拟实现
    • 2.1 创建
    • 2.2 入队
    • 2.3 出队
    • 2.4 队头
    • 2.5 队尾
    • 2.6判空
    • 2.7元素个数
    • 2.8 测试代码
  • 3. queue
    • 3.1 创建
    • 3.2 size / empty
    • 3.3 push / pop
    • 3.4 front / back
    • 3.5 测试代码
  • 4. 双端队列
  • 5. deque
    • 5.1 创建
    • 5.2 size / empty
    • 5.3 push_front / push_back
    • 5.4 front / back
    • 5.6 clear
    • 5.7 测试代码
  • 6. 练习
  • 结语

前言

队列是计算机科学中一种基础且重要的数据结构,遵循先进先出(FIFO)的原则,广泛应用于算法竞赛、操作系统调度、网络通信等领域。掌握队列及其变种(如双端队列)的实现与应用,能够帮助解决许多实际问题,例如广度优先搜索(BFS)、滑动窗口优化等。

本内容从队列的基本概念出发,逐步介绍如何通过数组或链表模拟队列的常见操作,包括入队、出队、访问队首队尾等。同时,结合 C++ STL 中的 queue 和 deque 容器,对比手动实现的差异,展示标准库的高效性与便捷性。最后通过练习题目巩固知识点,提升对队列灵活运用的能力。

无论是初学者还是有一定经验的选手,都能通过本内容系统理解队列的核心思想,并熟练应用于竞赛编程中。

1. 队列的概念

队列也是一种访问受限的线性表,它只允许在表的一端进行插入操作,在另一端进行删除操作。

允许插入的一端称为队尾,允许删除的一端称为队头。

先进入队列的元素会先出队,故队列具有先进先出的特性,类似于食堂打饭的特点,先排队的人先有饭吃(不插队情况下)。

当队列中没有元素时,被称为空队,同时元素在队列里进出被称为入队和出队。

这就是空队的情况。

一头插入一头删除。

2. 队列的模拟实现

2.1 创建

  • 一个足够大的数组充当队列;
  • 一个变量 h 标记队头元素的前一个位置;
  • 一个变量 t 标记队尾元素的位置。

两个变量(h, t]是一种左开右闭的形式,这样设定纯属个人喜好,因为后续的代码写着比较舒服。

当然,也可以 h 标记队头元素的位置。只要能控制住代码不出现 bug,想怎么实现就怎么实现。

constintN=1e6+10;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[h+1];}

时间复杂度:O(1)

2.5 队尾

返回队列里面的最后一个元素

// 队尾元素intback(){returnq[t];}

时间复杂度:O(1)

2.6判空

判断队列是否为空。

// 队列是否为空boolempty(){returnt==h;}

时间复杂度:O(1)

2.7元素个数

返回队列里面元素的个数。

// 队列的大小intsize(){returnt-h;}

时间复杂度:O(1)

2.8 测试代码

#include<iostream>usingnamespacestd;constintN=1e5+10;// 创建intq[N],h,t;// 入队voidpush(intx){q[++t]=x;}// 出队voidpop(){h++;}// 查询队头元素intfront(){returnq[h+1];}// 查询队尾元素intback(){returnq[t];}// 判断是否为空boolempty(){returnh==t;}// 有效元素的个数intsize(){returnt-h;}intmain(){// 测试for(inti=1;i<=10;i++){push(i);}while(size())// while(!empty()){cout<<front()<<" "<<back()<<endl;pop();}return0;}

运行演示结果:

3. queue

依旧注意三点:

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

3.1 创建

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

3.2 size / empty

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

时间复杂度:O(1)

3.3 push / pop

  1. push:入队;
  2. pop:出队。

时间复杂度:O(1)

3.4 front / back

  1. front:返回队头元素,但不会删除;
  2. back:返回队尾元素,但不会删除。

时间复杂度:O(1)

3.5 测试代码

#include<iostream>#include<queue>usingnamespacestd;typedefpair<int,int>PII;intmain(){// 测试 queuequeue<PII>q;for(inti=1;i<=10;i++){q.push({i,i*10});}while(q.size())// while(!q.empty()){autot=q.front();q.pop();cout<<t.first<<" "<<t.second<<endl;}return0;}

运行演示结果:

4. 双端队列

双端队列也是一种特殊线性结构,其允许两端都可以进行数据元素入队和出队操作。

将队列的两端分别称为前端和后端,两端都可以进行数据入队和出队。

5. deque

5.1 创建

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

5.2 size / empty

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

时间复杂度:O(1)

5.3 push_front / push_back

  1. push_front:头插;
  2. push_back:尾插。

时间复杂度:O(1)

5.4 front / back

  1. front:返回队头元素,但不会删除;
  2. back:返回队尾元素,但不会删除。

时间复杂度:O(1)

5.6 clear

clear:清空队列。

时间复杂度:O(N)

5.7 测试代码

#include<iostream>#include<deque>usingnamespacestd;structnode{intx,y,z;};intmain(){deque<node>q;// 头插for(inti=1;i<=5;i++){q.push_front({i,i*2,i*3});}// 头删while(q.size()){autot=q.front();q.pop_front();cout<<t.x<<" "<<t.y<<" "<<t.z<<endl;}// 尾插for(inti=1;i<=5;i++){q.push_back({i,i*2,i*3});}// 尾删while(q.size()){autot=q.back();q.pop_back();cout<<t.x<<" "<<t.y<<" "<<t.z<<endl;}return0;}

运行演示结果:

6. 练习

  1. 队列

  2. 海港


结语

队列作为基础数据结构,遵循先进先出(FIFO)原则,在广度优先搜索(BFS)、任务调度等场景中广泛应用。通过模拟实现和标准库 queue 的对比,可以更深入理解其核心操作(入队、出队、访问队首/队尾)的底层逻辑。

愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 11:48:38

用PLC和变频器控制的节能型小高层电梯系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

用PLC和变频器控制的节能型小高层电梯系统 目录 第一章 绪论 2 1.1电梯继电器控制系统的优点和缺点 2 1.1.1 电梯继电器控制系统的优点 2 1.1.2电梯继电器控制系统的缺点 3 1.2 PLC及在电梯控制中的应用特点 3 1.2.1 PLC的特点 3 1.2.2 PLC控制电梯的优点 5 1.3电梯变频调速控制…

作者头像 李华
网站建设 2026/10/14 12:25:28

Qwen3-4B-Instruct-2507功能测评:40亿参数竟有如此表现

Qwen3-4B-Instruct-2507功能测评&#xff1a;40亿参数竟有如此表现 1. 背景与选型动机 近年来&#xff0c;大模型的发展呈现出两极分化趋势&#xff1a;一方面是以千亿参数为代表的“巨无霸”模型追求极致性能&#xff1b;另一方面&#xff0c;轻量级模型则致力于在资源受限环…

作者头像 李华
网站建设 2026/10/15 13:48:21

Youtu-2B零基础教程:云端GPU免配置,1小时1块快速体验

Youtu-2B零基础教程&#xff1a;云端GPU免配置&#xff0c;1小时1块快速体验 你是不是也和我一样&#xff0c;是个普通大学生&#xff1f;最近在GitHub上看到腾讯开源的Youtu-2B这个小型大语言模型&#xff0c;参数才19.6亿&#xff0c;支持128k超长上下文&#xff0c;还能当智…

作者头像 李华
网站建设 2026/10/15 9:39:03

导师严选9个AI论文工具,专科生轻松搞定毕业论文!

导师严选9个AI论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09;在众多AI论文工具中&#xff0c;**千笔**凭借其强大的论文生成能力脱颖…

作者头像 李华
网站建设 2026/10/15 13:06:06

BGE-Reranker-v2-m3技术深度:解析其如何减少LLM幻觉问题

BGE-Reranker-v2-m3技术深度&#xff1a;解析其如何减少LLM幻觉问题 1. 引言&#xff1a;RAG系统中的“精准排序”挑战 在当前基于大语言模型&#xff08;LLM&#xff09;的检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统中&#xff0c;一个核…

作者头像 李华
网站建设 2026/10/15 21:49:03

进阶-InnoDB引擎-事务

一、MySQL进阶“当两个银行账户同时转账时&#xff0c;你希望系统是‘要么全部成功&#xff0c;要么全部失败’&#xff0c;而不是让钱‘消失’或‘凭空多出’。” —— 事务&#xff0c;是数据库的“保险丝”&#xff0c;也是高并发系统的“定海神针”为什么事务如此重要&…

作者头像 李华