队列——queue

2023-11-16

Hello,这是你们的苦力怕。今天我去医院做核酸检测,排了老长的队,wait了半个多小时才做完,真是把我整无语死了,但是我在wait的过程中突然想到了一个问题:啥数据结构跟排队很像?对了,就是大名鼎的队列


目录

什么是队列?

队列的用法

队列的头文件

队列的定义

用法

栗子

队列的更改操作

在尾部增加一个元素

在头部删除一个元素

栗子

访问操作

查询队列是否为空

查询队列的元素个数

查询队列的队首

查询队尾的值

栗子

原理

总结


什么是队列

队列是一种线性数据结构,也就意味着它的本质上就是有特殊功能的数组,当然我们不能直接用一个数组来实现它。具体实现方法我后面会说。

同时,队列的英文为queue,是一种具有先进先出机制的数据结构,相当于说,队列就是先进去的先出来,后进去的后出来,井然有序,绝不会出现插队的现象。

它支持的改变队列内部结构和值的操作应有两个

  1. 在整个队列的尾部增加一个元素
  2. 在整个队列的头部删除一个元素

而一般来说,队列所支持的访问操作应有四个:

  1. 查询队列是否为空
  2. 查询队列的元素个数
  3. 查询队首(front)的值

  4. 查询队尾(tear)的值

关于队列有这几个名词要大家记一下 :

  1. 队头(front)指整个队列的头部
  2. 队尾(tear)指整个队列的尾端
  3. 先进先出(FIFO,first in first out)指队列这种第一个进来第一个出去的机制
  4. 队列(queue)指具有先进先出机制的线性数据结构

队列的用法

队列的头文件

在我们万能的C++标准库中也有关于队列(queue)的实现,它是用容器模板实现的,所以它就可以往里面放入各种类型的元素,并且头文件也叫<queue>,所以我们可以直接包含它,当然,它也包含在我们的万能头中。所以如果我们要使用标准库中的queue函数,我们就应该先在整个代码的前面加上一句

#include <queue>

虽然看起来很简单,但是其实很容易被遗忘,Debug的时间又longer了。-_-

队列的定义

用法

队列的定义语法如下

queue<Type, Container> Name

其中Type指的是所存放元素的类型是必填的

Container指的是存放元素的容器,可填可不填,不填时默认为deque

注意:Container不能为vector,因为vector没法从开头删除元素。

Name指的是你定义的这个queue的名称,为合法标识符。

所以我这里给大家举几个栗子,让大家熟悉下

栗子

queue<int> q1;
queue<double, list> q2;
queue<long long, deque> q3;
queue<char, vector> q4;
queue<short> 4times;

我们可以看到,第一个q1肯定是合法的,它定义了一个名字为q1,以默认的deque为容器载体的存放int类型的queue

第二个它也是合法的,它定义了一个名字为q2,以list为容器载体的存放double类型的queue

第三个也是合法的,它定义了一个名字为q3,以deque为容器载体的存放long long类型的queue(注:尖括号里的第二项可以省略不写,达到同样的效果)

第四个是不合法的,因为vector不能做queue的容器载体,原因前面讲过,因为vector不支持pop_front()操作。

第五个也是不合法的,因为4times不是一个合法标识符,它以数字开头,使它变成了不合法标识符。

队列的更改操作

在尾部增加一个元素

在尾部(tear)增加一个元素,就好比在排队过程中,又有一个人来排队了,这种操作在queue中为push

语法:

Name.push(Value);

其中Name表示要在名称为Name的队列里添加元素

Value表示要被添加到Name里的元素的值(注:如果Value不是队列Name的类型,会报编译错误)

无返回值

在头部删除一个元素

在头部(front)删除一个元素,就好比在排队过程中,有一个人处理完了,便离开队伍了,这种操作在queue中为pop

语法:

Name.pop();

Name代表所要删除头部元素的队列的名称

无返回值

栗子

接下来我举几个栗子

queue<int> q;
q.push(5);
q.pop();
q.pop();
q.push('5');

我们可以看到第二行显然是正确的,它的作用是往q的尾部塞一个值为5的元素。

第三行也是正确的,它的作用是把q的头部,元素5删除。

第四行是错误的,因为q已经为空了,没法再删除元素了。

第五行也是错误的,因为'5'是一个char类型,没法加到int类型的q里去。

访问操作

查询队列是否为空

这种操作在STL中语法为empty,跟其他的数据结构很像

语法:

Name.empty();

这个函数的返回值为bool,队列为空时为true,非空时为false

其中Name代表的是要查询的队列的名称

查询队列的元素个数

这种操作在STL中语法为size,跟其他的数据结构很像

语法:

Name.size();

这个函数的返回值为一个无符号整数,代表这个队列所包含的元素的个数

其中Name代表的是要查询的队列的名称

查询队列的队首

这种操作在STL中语法为front

语法:

Name.front();

这个函数的返回值为一个Name的类型的值,代表这个队列的队首的值

其中Name代表的是要查询的队列的名称

查询队尾的值

这种操作在STL中语法为back

语法:

Name.back();

这个函数的返回值为一个Name的类型的值,代表这个队列的队尾的值

其中Name代表的是要查询的队列的名称

栗子

然后我再举几个栗子。

queue<int> q;
q.push(88);
cout << q.front() << " " << q.back() << endl;
q.push(99);
q.push(11);
cout << q.front() << " " << q.back() << endl;
q.pop();
cout << q.size() << endl;
q.pop();
q.pop();
cout << q.empty() << endl;

这段代码应输出

88 88
88 11
2
1

我们一个一个来看,第一行输出88 88,因为q里只有一个元素88,所以队首与队尾都是88

第二行输出88 11,因为此时q里已经有3个元素:88 99 11了,那它的队首就是88,队尾就是11

第三行输出2,因为此时q里被删了一个元素,成了99 11了,所以它的大小就是2

第四行输出1,因为此时q已经变成空队列了,所以是true,即1

原理

C++queue默认是依靠deque来运作的,而deque的原理就是循环队列

循环队列原理如下:

循环队列是将一个队列放到一个数组里去,用一个变量head标记在该数组中队头的位置,用一个变量tail来标记在该数组中队尾后一个的位置(因为如果直接记队尾的话会更不好操作),初始状态下,head=tail,代表该队列为空,加入一个元素就是先把数组的tail位置更换成加入的元素,再tail++,删除一个元素就是把数组的head++(因为如果把每一个位置都往前移的话,就会把时间复杂度拉到O(N),相比之下,一个元素的空间可以忽略不计)。判断是否为空就是判断head是否等于tail,如果相等就是空的,反之非空。判断队首和队尾就直接把相应位置的值输出即可(tail要减1)。判断长度就是把head+数组的大小减去tail再模上数组的大小输出(想想为什么)。如果head或tail超过了数组的上线,head和tail可以重新变成1,这也是为什么叫它循环队列。

总结

队列是一个非常常用的数据结构,大家一定要掌握它哦。

今天苦力怕就讲到这里,886

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

队列——queue 的相关文章

  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • ARouter 之注解 @JvmField 和 @Autowired

    文章目录 1 定义 2 使用 3 源码分析 4 为什么 Autowired 要搭配 JvmFiled 同时使用 1 定义 在 Activity 进行数据传递一般都会通过 getIntent putxxx getxxx 方法 在 Fragme
  • 【华为OD机试真题 python】查找重复代码【2022 Q4

    题目描述 查找重复代码 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给定两行代码 字符串长度 1 lt length lt 100 由英文字母 数字和空格组
  • s2.ubuntu搭建s3c2440平台arm-linux-gcc交叉编译工具链安装+资源下载

    交叉编译工具包arm linux gcc 3 4 5 glibc 2 3 6 tar bz2 zip 蓝奏云 文件实际后缀是 bz2 下载后去掉 zip后缀 然后放入Ubuntu系统 具体步骤 1 复制交叉编译链的包到Ubuntu中 这里我
  • Spring学习(五):Spring中注入一些细节

    1 字面值 字面值 可用字符串表示的值 可以通过
  • Misc

    我可是黑客 用winehx打开 下拉到最后 moctf e4sy 1ma9e m1sc 假装安全 用kali的binwalk分离 打开记事本 mcfCrflyS1eot eul ld 扫扫出奇迹 用QR Research直接扫 或者用Ste
  • Linux 4G 通信实验

    目录 4G 网络连接简介 高新兴ME3630 4G 模块实验 ME3630 4G 模块简介 ME3630 4G 模块驱动修改 1 Linux内核添加代码 USB设备信息 2 Linux内核添加代码 添加ECM支持程序 3 配置使能Linux
  • 计算机怎么快速查找应用,win10系统如何快速查找应用?win10系统快速查找应用的方法...

    win10电脑经常会安装各种程序应用 因为没有添加到桌面 所以这个时候很难找到 如果一个一个程序查找很浪费时间 有什么快速查找应用的方法 针对此疑问 小编和大家说说win10系统快速查找应用的方法 具体方法如下 1 首先你要找到 开始菜单
  • Vue3+Element-Plus 实现表单中搜索功能 三五

    1 当用户在表单搜索框中 输入要搜索的用户名 点击搜索按钮后 查找到相对应的用户数据 2 实现搜索功能的步骤 2 1 首先 使用v model 指令 将文本输入框的数据与 data 中的数据做双向绑定 2 2 其次 为搜索按钮绑定单击事件
  • Java中Math类中的常用方法

    Java中Math类中的常用方法 代码实例 public class Demo1 Math public static void main String args System out println Math PI System out
  • 使用备份工具mysqldump备份数据库

    MySQL自带的备份工具mysqldump 可以很方便的对MySQL进行备份 通过该命令工具可以将数据库 数据表或全部的库导出为SQL脚本 便于该命令在不同版本的MySQL服务器上使用 例如 当需要升级MySQL服务器时 可以先使用mysq
  • Java 读取jar内包资源文件和读取jar包外资源文件

    Java 读取jar包内资源文件 读取jar 包内资源文件application properties InputStream appPropertiesInputStream ApplicationPropertiesHolder cla
  • U-Net 模型改进和应用场景研究性综述

    U Net综述 1 文章介绍 2 U Net介绍 3 结构改进 4 非结构改进 4 1 预处理 数据增强 4 2 训练 数据归一化 4 3 训练 激活函数 4 4 训练 损失函数 4 5 结构改进总结 5 U Net应用场景 5 1 视网膜
  • PAN和MS融和综述(pansharpening)

    PAN和MS融和综述 pansharpening 一 基于成分替代的图像融和 1 基于IHS变换的图像融合方法 IHS方法是将原始多光谱图像从RGB空间变换到IHS空间 然后用高分辨率图像或用不同投影方式得到的待融合图像替代I分量 在IHS
  • spring的InitializingBean接口、DisposableBean接口

    本文介绍spring中与bean有关的一些接口 afterPropertiesSet afterPropertiesSet 方法是 Spring 框架中的一个初始化方法 主要用于在 Bean 实例化和属性注入完成后执行一些初始化操作 具体来
  • windows 7 系统安装

    环境 workstation 10 虚拟机 GHOST windows 7 32位 今天安装系统 碰到一些问题 在此记录 问题一是分区后 重启黑屏的问题 解决方案 问题二 点击安装到第一分区 自动跳转到dos工具界面问题 解决方案 问题三
  • Qt之QLabel

    简述 QLabel提供了一个文本或图像的显示 没有提供用户交互功能 一个QLabel可以包含以下任意内容类型 内容 设置 纯文本 使用setText 设置一个QString 富文本 使用setText 设置一个富文本的QString 图像
  • HR人员和岗位关联日期问题

    离职日期是4月3号 但4月1 2号的数据在GET PERNR 就查不到 原因是人员和岗位关联日期在3月31号就结束了 所以选中组织结构后找不到数据了 表HRP1001可以查看 O组织 S岗位 P人员 修改 PO13 gt 关系显示 gt 找
  • UNIX网络编程之源代码的编译和使用

    UNIX网络编程入门 对于想学习网络编程的来说 UNIX网络编程 这书肯定是不二选择 所谓实践是检验真理的唯一标志 特别是对于编程来讲 再多的理论经验也比不过code一次 UNIX网络编程 这本书提供连源码下载 第三本版的源码可点击这里下载
  • Linux——(第六章)常用指令(一)

    目录 一 帮助指令 1 man获取帮助信息 2 help指令 3 常用快捷键 二 文件和目录相关指令 1 pwd 指令 2 ls 指令 3 cd 指令 4 mkdir 指令 5 rmdir指令 6 touch指令 7 cp 指令 8 rm
  • 队列——queue

    Hello 这是你们的苦力怕 今天我去医院做核酸检测 排了老长的队 wait了半个多小时才做完 真是把我整无语死了 但是我在wait的过程中突然想到了一个问题 啥数据结构跟排队很像 对了 就是大名鼎的队列 目录 什么是队列 队列的用法 队列