队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开。

如图 5-4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删除队首元素的操作称为“出队”。

队列的先入先出规则

图 5-4   队列的先入先出规则

5.2.1   队列常用操作¶

队列的常见操作如表 5-2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与栈相同的方法命名。

表 5-2   队列操作效率

方法名描述时间复杂度
push()元素入队,即将元素添加至队尾
pop()队首元素出队
peek()访问队首元素

我们可以直接使用编程语言中现成的队列类:

/* 初始化队列 */
queue<int> queue;/* 元素入队 */
queue.push(1);
queue.push(3);
queue.push(2);
queue.push(5);
queue.push(4);/* 访问队首元素 */
int front = queue.front();/* 元素出队 */
queue.pop();/* 获取队列的长度 */
int size = queue.size();/* 判断队列是否为空 */
bool empty = queue.empty();

5.2.2   队列实现¶

为了实现队列,我们需要一种数据结构,可以在一端添加元素,并在另一端删除元素,链表和数组都符合要求。

1.   基于链表的实现¶

如图 5-5 所示,我们可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”,规定队尾仅可添加节点,队首仅可删除节点。

图 5-5   基于链表实现队列的入队出队操作

以下是用链表实现队列的代码:

#include <iostream>
#include <vector>
#include <stdexcept> // 用于异常处理
#include <stack>
using namespace std;
/* 用列表实现队列的代码*/struct ListNode {int val;ListNode* next;ListNode(int value) : val(value), next(nullptr) {}
};// 队列类的定义
class LinkedListQueue
{private:ListNode* front, * rear; //队列头,队列尾int queSize; //队列长度//释放链表内存void freeMemoryLinkedList(ListNode* node) {while (node != nullptr) {ListNode* temp = node;node = node->next;delete temp;}}public:// 构造函数LinkedListQueue() : front(nullptr), rear(nullptr), queSize(0) {}//析构函数~LinkedListQueue() {freeMemoryLinkedList(front);}//获取队列大小int size() {return queSize;}//判断队列是否为空bool isEmpty() {return queSize == 0;}//入队 (尾插) void push(int num) {ListNode* node = new ListNode(num);if (front == nullptr) { // 队列为空,头尾部指向新节点front = node;rear = node;}else { // 队列不为空,尾插rear->next = node;rear = node;}queSize++;}//出队 (删除头节点)int pop() {if (isEmpty()){throw out_of_range("队列为空,不能出队");}int val = front->val;//先保存队首值ListNode* temp = front;	//备份队节点front = front->next;	 //指向下一节点delete temp;//释放原队首节点queSize--;if (front == nullptr) { //如果队列为空,重置rearrear = nullptr;}return val;}//访问队列首元素int peek() {if (isEmpty()){throw out_of_range("队列为空");}return front->val;}//转换为vector返回vector<int> toVector() {vector<int> res(size());ListNode* node = front;for (int i = 0; i < res.size(); i++){res[i] = node->val;node = node->next;}return res;}
};int main() {LinkedListQueue q;q.push(10);q.push(20);q.push(30);cout << "队列中元素 : ";vector<int> v = q.toVector();for (int num : v){cout << num << " ";}cout << endl;cout << "队首元素: " << q.peek() << endl;while (!q.isEmpty()) {cout << "出队元素: " << q.pop() << endl;}cout << "队列长度: " << q.size() << endl;system("pause");return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1.

问题描述 俩数之和&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按…

c练习-c基础

#include <stdio.h>int main() {//打印数组中的最大值int arr[10];int max,i;for (i 0; i < 10; i){scanf_s("%d", &arr[i]);}max arr[0];for (i 0; i < 10; i){if(max < arr[i 1]){max arr[i 1];}}printf("数组中最大值&#xff1a;%…

Numpy科学计算(五分钟小白从入门到精通)

2.1 numpy介绍numpy是Python中科学计算的基础包。它是一个Python库&#xff0c;提供多维数组对象、各种派生对象&#xff08;例如掩码数组和矩阵&#xff09;以及用于对数组进行快速操作的各种方法&#xff0c;包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基…

从零掌握微服务通信安全:mTLS全解析

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生时代&#xff0c;微服务架构的普及带来了灵活性和可扩展性&#xff0c;但也让服务间通信的安全性成为核心挑战。mTLS&#xff08;Mutual TLS&…

Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模块中用于强制销毁 TCP 套接字的方法&#xff0c;比 socket.end() 更彻底。下面我将从多个方面全面讲解这个方法。 基本用法 const net require(net);const server net.createServer((socket) > {// 强制销毁套接字socket.destroy(); })…

vmware 克隆虚拟机,报错:克隆时出错:指定不存在的设备。然后电脑卡死,只能强制关机再开机。

vmware 克隆虚拟机&#xff0c;报错&#xff1a;克隆时出错:指定不存在的设备。然后电脑卡死&#xff0c;只能强制关机再开机。1、问题描述2、问题原因3、解决方法1、问题描述 vmware 版本&#xff1a;vmware workstation pro 17.6.3 克隆虚拟机时&#xff0c;创建完整克隆&am…

如何使用Python将任意PPT变为“智能模板”(解决 python-pptx 替换元素无法保留格式的问题,阴影、填充等属性保留!)

文章目录 📖 介绍 📖 🏡 演示环境 🏡 📒 深入 OpenXML:格式保留的终极武器 📒 🚀 如何打造你自己的“格式保留”PPT模板? 🧐 为什么格式会丢失? 🖼️ 方案一:图片的“格式移植”大法 🛠️ 实现代码 🔹 原理解析 ✍️ 方案二:文本的“外科手术”大法…

学习python中离线安装pip及下载package的方法

正常而言&#xff0c;Python 3.4及以上版本默认自带pip工具‌&#xff0c;无需额外安装&#xff0c;如果需要单独离线安装pip&#xff0c;可以先使用DeepSeek查看指定操作系统能安装的最高pip版本&#xff0c;然后在参考文献1中现在指定版本的pip离线安装文件&#xff0c;通常为…

liunx运维进阶脚本

一、文件与目录操作1.快速创建目录树mkdir -p project/{src,doc,test/{unit,integration}}创建嵌套目录结构&#xff0c;避免逐层创建。2查找并删除7天前的日志文件find /var/log -name "*.log" -mtime 7 -exec rm -f {} \;结合find和exec实现定时清理。3.批量重命名…

Apache Ignite 中的 SQL 模式(Schema)管理机制

这段内容讲的是 Apache Ignite 中的 SQL 模式&#xff08;Schema&#xff09;管理机制。我们可以从几个方面来理解&#xff1a; 一、什么是 Schema&#xff08;模式&#xff09;&#xff1f; 在 SQL 中&#xff0c;Schema 是数据库对象&#xff08;如表、视图等&#xff09;的…

分布式光伏发电多合一(也称为五合一或者群调群控)终端,从功能、市场前景等等方面介绍

对于当下分布式光伏从业者&#xff0c;多合一终端经常被提及到。而且很多地区也有正常使用&#xff0c;目前来看&#xff0c;使用效果也是比较好的&#xff0c;满足当下的使用要求。并且价格也是可以接受。下面从几个方面简单介绍一下。功能介绍 5G通信功能 设备内置 5G通信模组…

AWE2026启动:加码AI科技,双展区联动开启产业新格局

7月22日&#xff0c;由中国家用电器协会主办的2026年中国家电及消费电子博览会&#xff08;AWE2026&#xff09;启动发布会在上海举行。据「TMT星球」了解&#xff0c;AWE2026将以“AI科技、慧享未来”为主题&#xff0c;首次启用“一展双区”的新模式&#xff0c;于2026年3月1…

Django基础(六)———数据库

前言上篇文章给大家介绍了DTL模板结构这篇文章将讲述Django框架与MySQL数据库的综合使用一、Django配置连接数据库在操作数据库之前&#xff0c;首先先要连接数据库&#xff0c;这里我们以配置MySQL为例来讲解。Diango连接数据库&#xff0c;不需要单独的创建一个连接对象。 只…

postgresql使用记录 SCRAM authentication requires libpq version 10 or above

文章目录 背景 如何用命令行连接数据库 报错 原因 解决方案 psql常见命令 🔍 **核心数据库操作命令** 1. **查看所有数据库** 2. **切换数据库** 3. **查看表及结构** 4. **执行 SQL 文件** 5. **退出 psql** ⚙️ **高级管理命令** ️ **注意事项** 背景 由于某种原因,无法…

2.0版本seata、nacos+ruoyi(微服务)配置

一、下载&#xff1a; seata下载&#xff1a;点击这里 nacos下载&#xff1a;点击这里 ruoyi&#xff08;微服务&#xff09;下载&#xff1a;点击这里 Git bash下载&#xff1a;点击这里 本文所用的版本&#xff1a; seata-2.2.0&#xff08;下图红色框框&#xff09;&a…

面试高频题 力扣 LCR 130.衣柜整理 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

目录零、题目描述一、为什么这道题值得一看&#xff1f;二、题目拆解&#xff1a;核心要素与约束三、算法实现&#xff1a;基于 DFS 的解决方案代码逻辑拆解五、时间复杂度与空间复杂度时间复杂度空间复杂度六、坑点总结七、举一反三八、洪水灌溉&#xff08;Flood Fill&#x…

Ext4文件系统全景解析

目录Ext4文件系统全景解析&#xff1a;从inode到数据恢复实战1. Ext文件系统的"小区规划"&#xff1a;块组结构详解 &#x1f3d8;️1.1 块组&#xff1a;文件系统的基本管理单元1.2 超级块的"多重备份"机制 &#x1f6e1;️2. inode&#xff1a;文件的&qu…

贪心算法Day4学习心得

先来看第一道&#xff1a;860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账单是20&#…

接口自动化测试种涉及到接口依赖怎么办?

《接口自动化测试中接口依赖的处理方式及选择原则》在接口自动化测试中&#xff0c;接口依赖是指某个接口的请求参数、执行条件或测试结果依赖于其他接口的输出&#xff08;如返回数据、状态等&#xff09;。处理接口依赖是确保测试用例准确性和稳定性的关键&#xff0c;常见的…

hive分区表临时加载日批数据文件

源系统每日上传一个csv数据文件到数据中台指定目录&#xff0c;数据中台用hive表进行ETL工作。 先建一个外部分区表&#xff1a; create external table tmp_lease_contract ( contract_id string, vin string, amount float ) partitioned by (dt string) row format delim…