当前位置: 首页 > news >正文

C++_Hello算法_队列

队列(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.lryc.cn/news/595899.html

相关文章:

  • 基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)
  • 188粉福
  • Spring快速整合Mybatis
  • 技术与情感交织的一生 (十)
  • nodejs:告别全局安装,npx 命令详解及其与 npm 的区别
  • 从零开始学CTF(第二十五期)
  • Gitlab-CI实现组件自动推送
  • n8n - 为技术团队提供安全的自动化工作流
  • 基于Kubernetes的微服务CI/CD:Jenkins Pipeline全流程实践
  • 知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师
  • STL学习(一、string容器)
  • 暑假算法训练.6
  • 深入浅出Python函数:参数传递、作用域与案例详解
  • 根据数据,判断神经网络所需的最小参数量
  • 设计模式七:抽象工厂模式(Abstract Factory Pattern)
  • 【Linux内核模块】模块声明与描述
  • 【RK3576】【Android14】MIC开发调试
  • 杭州网站建设选哪家?派迪科技项目实力展示
  • Python 正则表达式在数据分析中的应用:实战指南
  • OpenCV基本的图像处理
  • AI助力临床医学科研创新与效率双提升丨临床医学日常工作、论文高效撰写与项目申报、数据分析与可视化、机器学习建模等
  • 深入解析 Pandas:Python 数据分析的强大工具
  • AWE2026启动:加码AI科技,双展区联动开启产业新格局
  • 小玩 Lifecycle
  • ESP32-Cam三脚架机器人:DIY你的智能移动监控平台
  • 单一职责原则(SRP):构建高质量软件的基石
  • 【接口自动化】掌握接口自动化:核心概念讲解(理论知识)
  • Java 大视界 -- Java 大数据在智能医疗医疗设备维护与管理中的应用(358)
  • 阁楼式货架:垂直空间革命下的仓储效率升级方案
  • 在线教育培训课程视频如何防下载、防盗录?