【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…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...