【C++篇】从售票窗口到算法核心:C++队列模拟全解析
文章目录
须知
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!
1. queue前言与背景
1.1 探秘 C++ 队列的核心魅力(前言)
队列(Queue)作为一种基础的数据结构,在计算机科学和实际开发中扮演着举足轻重的角色。它以 FIFO(先进先出) 的操作规则,为解决排队问题提供了直观而高效的解决方案。无论是任务调度、流量控制,还是数据处理,队列都能够以其简洁的逻辑和高效的存储方式应对各种场景。
在 C++ 中,标准模板库(STL)为开发者提供了 queue 和 deque 容器,使得队列的实现和使用变得方便快捷。然而,理解和实现一个队列的核心逻辑,是掌握 C++ 编程能力的重要环节之一。
1.2 队列的应用背景
队列的使用场景十分广泛,几乎涵盖了所有需要顺序处理的场景,例如:
1.2.1 操作系统中的任务调度
队列用于维护任务或进程的执行顺序,如打印队列、CPU 的任务调度队列等。
1.2.2 网络数据传输
数据包的顺序传递依赖队列,确保数据按照正确的顺序被处理或传递。
1.2.3 广度优先搜索(BFS)
在图的遍历中,队列用来存储当前层的节点,并逐层扩展。
1.2.4 消息队列(Message Queue)
在分布式系统中,队列用于解耦系统组件,实现任务的异步处理。
2. 深入理解队列:用 C++ 模拟实现队列的完整指南
队列(Queue)是一种重要的线性数据结构,其操作遵循 “先进先出(FIFO)” 的原则。本文将通过手动模拟队列的实现,帮助你深刻理解其原理,同时加深对 C++ 编程的掌握。让我们从队列的基本概念开始,到实现和优化,逐步构建一个高质量的队列实现。
2.1 队列的概念与应用场景
2.1.1 队列的基本特点
- 操作规则:队列的元素按插入顺序排列,新元素从队尾插入,旧元素从队首移出。
- 常用操作:
push
:将元素插入队尾。pop
:移除队首的元素。front
:获取队首的元素。empty
:判断队列是否为空。
2.2 用 C++ 模拟实现队列
实现思路
为了模拟队列的行为,可以使用一个底层容器(如 std::vector
或 std::list
),手动实现队列的操作。我们采用 std::vector
实现一个简单的队列类。
2.2.1 示例代码:
#include <iostream>
#include <vector>
using namespace std;// 自定义队列类
class Queue {
private:vector<int> data; // 使用 vector 作为底层存储int frontIndex; // 指向队首的索引public:// 构造函数Queue() : frontIndex(0) {}// 入队操作void push(int value) {data.push_back(value);}// 出队操作void pop() {if (!empty()) {frontIndex++; // 仅移动 frontIndex} else {cout << "Queue is empty. Cannot pop." << endl;}}// 获取队首元素int front() {if (!empty()) {return data[frontIndex];} else {throw runtime_error("Queue is empty.");}}// 判断队列是否为空bool empty() {return frontIndex >= data.size();}// 获取队列中元素的数量int size() {return data.size() - frontIndex;}
};int main() {Queue q;// 测试队列功能q.push(10);q.push(20);q.push(30);cout << "Front element: " << q.front() << endl; // 输出 10q.pop();cout << "Front element after pop: " << q.front() << endl; // 输出 20q.pop();q.pop();cout << "Is queue empty? " << (q.empty() ? "Yes" : "No") << endl; // 输出 Yesreturn 0;
}
2.3 实现细节与优化思考
2.3.1 空间优化
上述实现中,出队时仅移动了 frontIndex
,导致已出队的元素仍占用内存。为了优化空间,可以定期清理 vector
的前部元素:
void pop() {if (!empty()) {frontIndex++;// 如果已出队元素数量过多,进行清理if (frontIndex > 100 && frontIndex > data.size() / 2) {data.erase(data.begin(), data.begin() + frontIndex);frontIndex = 0;}} else {cout << "Queue is empty. Cannot pop." << endl;}
}
2.3.2 使用双端队列
std::deque
是一个更适合队列实现的容器,因为其支持 O(1) 的头尾操作。如果换用 std::deque
,代码将更加简洁高效。
3. C++ STL 中的队列
C++ 提供了标准模板库 std::queue
,封装了队列的常用操作。以下是使用 STL 实现同样功能的代码:
#include <iostream>
#include <queue>
using namespace std;int main() {queue<int> q;q.push(10);q.push(20);q.push(30);cout << "Front element: " << q.front() << endl; // 输出 10q.pop();cout << "Front element after pop: " << q.front() << endl; // 输出 20q.pop();q.pop();cout << "Is queue empty? " << (q.empty() ? "Yes" : "No") << endl; // 输出 Yesreturn 0;
}
4. 总结与展望
- 理解本质:手动实现队列,让我们深入理解了数据结构背后的设计思想。
- 优化与扩展:从空间优化到使用更高效的容器,队列的实现与改进展示了编程的灵活性。
- 实际应用:在复杂的算法设计中,队列是不可或缺的工具,比如 BFS 和任务调度等场景。
5. 结语
通过对 C++ 队列模拟实现的深入探讨,我们不仅掌握了队列的核心逻辑和实现细节,也进一步体会到了数据结构在实际开发中的重要性。从 基础实现 到 优化设计,每一步都帮助我们更深入地理解了队列这一数据结构的魅力。
队列虽然结构简单,但其在操作系统、图算法、消息处理等领域的广泛应用,体现了基础数据结构的强大功能。通过此次模拟实现,我们也更加体会到:
- 逻辑清晰 和 高效运算 是设计数据结构的关键;
- 不同的底层实现(如数组或链表)各有优劣,选择时需要根据应用场景做出权衡;
- 标准库(如 STL)的实现为开发提供了便捷,同时学习底层实现有助于提升对性能和资源优化的理解。
通过学习和实现队列,我们不仅收获了代码能力,还培养了分析问题和解决问题的思维方式。希望本文能为你在 C++ 编程和数据结构的学习旅程中提供帮助。如果你有其他问题或想法,欢迎交流探讨!
路虽远,行则将至;事虽难,做则必成
下一篇文章再会!!!
相关文章:

【C++篇】从售票窗口到算法核心:C++队列模拟全解析
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...

clipboard
clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…...

【Mac】VMware Fusion Pro 安装 CentOS 7
1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像(7.9、9),会一直卡在安装界面(在 install 界面按 enter 回车无效),想要使用需要经过一系列操作&#…...

游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...

洛谷 B2038:奇偶 ASCII 值判断
【题目来源】https://www.luogu.com.cn/problem/B2038http://shnoip.openjudge.cn/level1/39/【题目描述】 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO。 例如,字符 A 的 ASCII…...

APIRouter
当然可以!理解 FastAPI 中直接在 FastAPI 实例上定义路由与使用 APIRouter 作为路由器的区别,对于编写结构良好、可维护性高的应用程序至关重要。下面,我将详细解释这两种方法的区别、各自的优缺点以及何时使用它们。 1. 直接在 FastAPI 实例…...

算法模板2:位运算+离散化+区间合并
文章目录 1.6 位运算**位运算的常见应用**1.7 离散化**经典离散化题目例子****1. 区间合并和覆盖长度问题****2. 区间查询与修改****3. 动态求第 K 小值****4. 区间最大重叠次数****5. 动态逆序对计数****6. 二维区间问题****7. 模拟车流/时间段事件****8. 区间众数统计** **具…...

钉钉授权登录
一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后,点击自己【新建的应用】,进入详细页面 四。进入应用详细页面。左边【分享设置】 注意:进…...

【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )
1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...

C语言中的结构体,指针,联合体的使用
目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体(联合体)10. typedef就是取别名总结 1. 概述 数组:连续的相同数据类型的集合 结构体:不同…...

基于卡尔曼滤波器的 PID 控制
基于卡尔曼滤波器的PID控制算法结合了经典控制理论和现代信号处理技术。卡尔曼滤波器(Kalman Filter, KF)可以对噪声数据进行平滑处理,从而改善PID控制器的性能,特别是在处理具有噪声和不确定性的系统时。以下是详细的设计过程&am…...

CVE-2022-26201
打开是这么个页面 左上角找到Admin访问 里面有个Add Users,访问一下,能创建用户,有个能上传图片的地方 普通的一句话木马无法访问flag,需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...

海信Java后端开发面试题及参考答案
TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...

传智杯 3-初赛:终端
题目描述: 有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal。具体来说,它需要支持如下命令: 1. touch filename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名…...

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【中间件】Redis
一、什么是Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果
流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展,流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言,把握这些趋势并积极应对挑战将是实现成功的关键…...

Java爬虫:获取商品详情的实践之旅
在当今这个信息爆炸的时代,数据的价值日益凸显。对于电商行业来说,商品详情的获取尤为重要,它不仅关系到产品的销售,还直接影响到用户体验。传统的人工获取方式耗时耗力,而自动化的爬虫技术则提供了一种高效解决方案。…...

行业分析---2024年小鹏汽车AI Day及三季度财报
1 背景 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...

写时复制,读时加载
实现写时复制,读时加载,原理为,申请内存时,只给一段线性地址空间,并不分配物理内存,当cpu读、写该内存时,发生缺页中,或者写错误,中断处理程序根据前面设置的内容&#x…...

Python和R基因组及蛋白质组学和代谢组学
🌵Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大,且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...

selenium环境搭建详细过程
一、准备工作 在开始搭建 Selenium 环境之前,确保具备以下条件: 1.稳定的网络连接: 以便能够下载所需的软件和驱动程序。 2.操作系统基础: 对您的操作系统(如 Windows、Mac 或 Linux)有基本的了解和操…...

Linux知识 - VIM
VI于VIM linux系统里边内置了一个编辑器就叫做vi(visual editor),但vi的功能非常有限,所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键,会进入插入模式…...

【数据结构】链表重难点突破
目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...

大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...

Varjo:垂直起降机混合现实培训解决方案
混合电动垂直起降机(VTOL)作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落,且排放要远远低于由航空汽油驱动的传统飞…...

sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用
最近要用SQLite3,之前放出来了SQLiteUtile工具,方便操作。今天发现AIGC方面,RAG知识库需要使用向量数据库,来存储知识信息。一般呢都是用mysql,但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件…...

10 基于深度学习的目标检测
首次完成时间:2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1)程序代码: import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …...

leetcode top100中的30道递归和贪心
21到30题,递归和贪心...

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2
七、创建前端项目 你下载了nodejs吗?从cn官网下载:http://nodejs.cn/download/,或者从一个国外org网站下载,选择自己想要的版本https://nodejs.org/download/release/,双击下载好的安装文件,选择安装路径安…...