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

【C++笔记】STL详解: stack 和 queue 的使用

前言在 C 的标准模板库 (STL) 中stack栈和 queue队列是非常重要且常用的数据结构。它们都属于“容器适配器”这意味着它们不是从零开始构建的而是封装了其他底层容器如 deque 或 list只提供特定的接口来限制元素的访问方式。一、stack1.1 stack的介绍栈是一种后进先出 (LIFO - Last-In-First-Out) 的数据结构。1. 头文件: #include stack2. 核心特性: 只能在一端栈顶进行插入和删除操作。如下图所示你可以把它想象成一摞盘子你只能把新盘子放在最上面也只能从最上面拿走盘子。1.2 stack的定义方式stack 的类模板声明template class T, class Container dequeT class stack;1. class T解释T 代表这个栈里要装的数据类型。例如当你写 std::stackint 时编译器就把这里的 T 全部替换成 int如果你写 std::stackstd::stringT 就是字符串类型。2.class Container dequeT解释① class Container这指明了栈底层具体是用什么数据结构来存数据的。就像之前说的stack 本身不直接管理内存它是一个“包工头”把具体存取数据的工作外包给了 Container。② dequeT (默认模板参数)如果在定义栈的时候你只提供存什么数据T而没指定怎么存Container编译器就会默认使用 std::dequeT双端队列作为底层的存储结构。3. class stack; (声明类名)解释 告诉编译器“定义一个叫 stack 的类”。代码示例演示1只指定了 T 为 int ,没有指定容器适配器#include iostream #include stack #include vector #include list int main() { // 场景 1最常见的用法 // 只指定了 T 为 int。 // 触发默认参数底层实际上是一个 std::dequeint std::stackint s1; s1.push(1); std::cout s1 栈顶: s1.top() std::endl; return 0; }代码示例演示2指定了 T 为 int ,并指定容器适配器为vector --- 数组栈#include iostream #include stack #include vector #include list int main() { // 场景 2替换底层容器为 vector // 指定 T 为 int并明确指出底层使用 std::vectorint // vector 在内存上是连续的有时候遍历或者缓存命中率更好 std::stackint, std::vectorint s2; s2.push(2); std::cout s2 栈顶: s2.top() std::endl; return 0; }代码示例演示3指定了 T 为 int ,并指定容器适配器为list --- 链式栈#include iostream #include stack #include vector #include list int main() { // 场景 3替换底层容器为 list // 指定 T 为 int底层使用 std::listint (双向链表) // 每次插入都是动态分配内存如果你的数据量变化极大且不想预先分配大块内存这很有用 std::stackint, std::listint s3; s3.push(3); std::cout s3 栈顶: s3.top() std::endl; return 0; }1.3 stack的常用方法1.3.1 push模板参数templateclass T函数原型void push (const T val);函数功能在stack的顶部插入一个新元素代码演示#include iostream // std::cout #include stack // std::stack int main () { std::stackint mystack; for (int i0; i5; i) mystack.push(i); std::cout Popping out elements...; while (!mystack.empty()) { std::cout mystack.top(); mystack.pop(); } std::cout \n; return 0; }打印结果为1.3.2 pop函数原型void pop();函数功能移除栈顶元素代码演示#include iostream // std::cout #include stack // std::stack int main () { std::stackint mystack; for (int i0; i5; i) mystack.push(i); std::cout Popping out elements...; while (!mystack.empty()) { std::cout mystack.top(); mystack.pop(); } std::cout \n; return 0; }打印结果为1.3.3 top模板参数templateclass T函数原型①T top();②const T top() const;函数功能返回stack 中顶部元素的引用代码示例// stack::top #include iostream // std::cout #include stack // std::stack int main () { std::stackint mystack; mystack.push(10); mystack.push(20); mystack.top() - 5; std::cout mystack.top() is now mystack.top() \n; return 0; }打印结果为1.3.4 empty函数原型bool empty() const;函数功能判断容器是否为空代码示例// stack::empty #include iostream // std::cout #include stack // std::stack int main () { std::stackint mystack; int sum (0); for (int i1;i10;i) mystack.push(i); while (!mystack.empty()) { sum mystack.top(); mystack.pop(); } std::cout total: sum \n; return 0; }打印结果1.3.5 size函数原型 size_type size() const;函数功能返回容器中元素的数量。代码示例// stack::size #include iostream // std::cout #include stack // std::stack int main() { std::stackint myints; std::cout 0. size: myints.size() \n; for (int i 0; i 5; i) myints.push(i); std::cout 1. size: myints.size() \n; myints.pop(); std::cout 2. size: myints.size() \n; return 0; }打印结果为1.3.6 swap函数原型void swap (stack x)函数功能交换两个stack的内容代码示例// stack::swap #include iostream // std::cout #include stack // std::stack int main() { std::stackint foo, bar; foo.push(10); foo.push(20); foo.push(30); bar.push(111); bar.push(222); foo.swap(bar); std::cout size of foo: foo.size() \n; std::cout size of bar: bar.size() \n; return 0; }打印结果为二、queue2.1queue的介绍队列是一种先进先出 (FIFO - First-In-First-Out) 的数据结构。1. 头文件: #include queue2. 核心特性: 在一端队尾插入元素在另一端队头移除元素。如下图所示它就像在超市排队结账排在最前面的人先结账离开新来的人排在队伍最后面2.2 queue的定义方式queue的类模板声明template class T, class Container dequeT class queue;1. class T解释T 代表这个栈里要装的数据类型。例如当你写 std::queueint 时编译器就把这里的 T 全部替换成 int如果你写 std::queuestd::stringT 就是字符串类型。2. class Container dequeT解释①class Container指明队列底层用什么容器来存数据。② dequeT如果你不特殊指定编译器默认给你分配 std::dequeT双端队列作为底层容器。温馨提示1. 在 stack 中只要底层容器支持在尾部操作push_back, pop_back, back就可以所以 vector 是可以作为栈的底层容器的。2.队列需要在尾部插入入队并且在头部删除出队。因此如果你想替换 queue 的底层容器这个被替换的容器必须同时支持以下操作push_back()在尾部添加元素pop_front()移除头部元素front()获取头部元素back()获取尾部元素3. 因为标准的 std::vector 不支持 pop_front()在数组头部删除元素会导致后面所有元素大搬家效率极低所以 std::vector 不能作为 queue 的底层容器4.如果你想定制queue的底层容器通常只能选择std::list双向链表或保持默认的std::deque双端队列。2.3 queue的常用方法2.3.1push函数模板templateclass T函数原型void push (const T val);函数功能在队列尾部插入元素代码示例// queue::push/pop #include iostream // std::cin, std::cout #include queue // std::queue int main () { std::queueint myqueue; int myint; std::cout Please enter some integers (enter 0 to end):\n; do { std::cin myint; myqueue.push (myint); } while (myint); std::cout myqueue contains: ; while (!myqueue.empty()) { std::cout myqueue.front(); myqueue.pop(); } std::cout \n; return 0; }打印结果2.3.2 pop函数原型void pop();函数功能移除队头元素代码示例// queue::push/pop #include iostream // std::cin, std::cout #include queue // std::queue int main () { std::queueint myqueue; int myint; std::cout Please enter some integers (enter 0 to end):\n; do { std::cin myint; myqueue.push (myint); } while (myint); std::cout myqueue contains: ; while (!myqueue.empty()) { std::cout myqueue.front(); myqueue.pop(); } std::cout \n; return 0; }打印结果2.3.3front模板参数templateclass T函数原型①T front();②const T front() const;函数功能返回队头元素代码示例// queue::front #include iostream // std::cout #include queue // std::queue int main () { std::queueint myqueue; myqueue.push(77); myqueue.push(16); myqueue.front() - myqueue.back(); // 77-1661 std::cout myqueue.front() is now myqueue.front() \n; return 0; }打印结果2.3.4back模板参数templateclass T函数原型①T back();②const T back() const;函数功能返回队尾元素代码示例// queue::back #include iostream // std::cout #include queue // std::queue int main () { std::queueint myqueue; myqueue.push(12); myqueue.push(75); // this is now the back myqueue.back() - myqueue.front(); std::cout myqueue.back() is now myqueue.back() \n; return 0; }打印结果2.3.5 empty函数原型bool empty() const;函数功能判断容器是否为空代码示例// queue::empty #include iostream // std::cout #include queue // std::queue int main() { std::queueint myqueue; int sum0; for (int i 1; i 10; i) myqueue.push(i); while (!myqueue.empty()) { sum myqueue.front(); myqueue.pop(); } std::cout total: sum \n; return 0; }打印结果2.3.6 size函数原型size_type size() const;函数功能返回队列中元素个数代码示例// queue::size #include iostream // std::cout #include queue // std::queue int main() { std::queueint myints; std::cout 0. size: myints.size() \n; for (int i 0; i 5; i) myints.push(i); std::cout 1. size: myints.size() \n; myints.pop(); std::cout 2. size: myints.size() \n; return 0; }打印结果既然看到这里了不妨关注点赞收藏感谢大家若有问题请指正。

相关文章:

【C++笔记】STL详解: stack 和 queue 的使用

前言:在 C 的标准模板库 (STL) 中,stack(栈)和 queue(队列)是非常重要且常用的数据结构。它们都属于“容器适配器”,这意味着它们不是从零开始构建的,而是封装了其他底层容器&#x…...

别再乱改组策略了!深入理解CredSSP更新与远程桌面安全的正确配置姿势

深入解析CredSSP安全机制与远程桌面连接的最佳实践 1. CredSSP协议与加密Oracle漏洞的本质 CredSSP(Credential Security Support Provider)协议是微软开发的一种身份验证协议,主要用于远程桌面连接等场景下的凭据安全传输。2018年曝光的CVE-…...

如何快速下载网页视频:猫抓(cat-catch)浏览器扩展完全指南

如何快速下载网页视频:猫抓(cat-catch)浏览器扩展完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch)是一款功能强…...

[嵌入式系统]的[WiFi网络配置]:从[连接不稳定]到[可靠通信]的实践指南

[嵌入式系统]的[WiFi网络配置]:从[连接不稳定]到[可靠通信]的实践指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 1. 问题发现:WiFi连接的隐形障碍 当我们在开…...

C#开发者必看:INIFileParser库解决INI配置文件乱码问题的实战指南

C#开发者必看:INIFileParser库解决INI配置文件乱码问题的实战指南 在Windows应用开发中,INI文件作为一种轻量级配置存储格式,至今仍被广泛使用。但许多C#开发者发现,当配置文件路径包含中文、空格或特殊字符时,传统的W…...

计算机毕设源码到底包含什么?一文搞懂标准交付物结构

一、为什么你的毕设源码总被导师打回? 每年毕业季,无数计算机专业学生都会遇到这样的场景:“导师看了一眼你的毕设源码,眉头一皱:‘这交付的什么?数据库脚本呢?接口文档呢?怎么连部署…...

Qwen3.5-9B Visio图表智能生成:根据文本描述自动创建流程图与架构图

Qwen3.5-9B Visio图表智能生成:根据文本描述自动创建流程图与架构图 1. 引言:告别手动绘图的烦恼 你有没有遇到过这样的情况?开会讨论完一个业务流程,需要把它画成流程图;或者设计了一个系统架构,得在Vis…...

避坑指南:RAG Pipeline中多阶段处理的5个性能陷阱与优化方案(附Qwen-Turbo限流配置)

RAG Pipeline性能优化实战:五大关键陷阱与云服务适配方案 当你的RAG系统从Demo走向生产环境时,PDF解析突然内存溢出,向量数据库写入耗时呈指数增长,API调用频繁触发限流——这些性能陷阱往往在真实业务压力下才会暴露。本文将解剖…...

【Python并发成本控制终极指南】:GIL移除后3大无锁模型选型公式与ROI量化对比表

第一章:Python无锁GIL环境下的并发成本控制全景图Python 的全局解释器锁(GIL)长期被视为多线程 CPU 密集型任务的性能瓶颈。然而,随着 CPython 3.13 引入实验性无锁 GIL(--without-pymalloc 配合 --with-experimental-…...

单片机自动脱模剂喷雾控制系统

/***实现功能:检测报警信号,脱模剂开模数计数信号***/ /***参数:1:脱模剂开模数 2:喷雾时间 3:延时时间 ***/ /***串口接收触摸屏参数设置字符串,接收并保存******/ /***端子输入口读开模数,比较设定值后输出到电磁阀**/ /***端子输入口读报警信号,到设定值关闭电机及加热**/#i…...

避坑指南:用Docker部署Oracle 11g时你一定会遇到的5个权限问题(附终极解决方案)

避坑指南:用Docker部署Oracle 11g时你一定会遇到的5个权限问题(附终极解决方案) 在容器化技术席卷全球的今天,Docker已成为部署数据库的首选工具之一。然而,当我们将Oracle 11g这样的传统数据库巨人塞进轻量级容器时&a…...

Java SpringBoot+Vue3+MyBatis 信息化在线教学平台系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展,教育行业正逐步向数字化、智能化转型。传统的线下教学模式受限于时间和空间,难以满足现代教育的高效性和灵活性需求。在线教学平台通过整合互联网技术与教育资源,为师生提供了便捷的交互渠道,有效提升…...

信号处理避坑指南:一维小波去噪中那些容易忽略的细节

信号处理避坑指南:一维小波去噪中那些容易忽略的细节 在信号处理领域,小波去噪因其优异的时频局部化特性,成为处理非平稳信号的首选方法。然而,许多工程师在应用PyWavelets等工具库时,往往陷入"调参陷阱"——…...

AI的恶意使用

AI 生成的内容与犯罪活动:人工智能系统正被滥用于生成诈骗、欺诈、敲诈勒索及未经同意的私密影像。尽管此类伤害的发生已有充分记录,但关于其发生率和严重程度的系统性数据仍然有限。 影响和操纵:在实验环境中,AI 生成的内容在改变…...

解锁3DS个性化定制:Anemone3DS主题管理器完全指南

解锁3DS个性化定制:Anemone3DS主题管理器完全指南 【免费下载链接】Anemone3DS A theme and boot splash manager for the Nintendo 3DS console 项目地址: https://gitcode.com/gh_mirrors/an/Anemone3DS 3DS主题定制是提升掌机使用体验的关键方式&#xff…...

Nanbeige 4.1-3B Streamlit WebUI效果展示:气泡时间戳与消息状态可视化

Nanbeige 4.1-3B Streamlit WebUI效果展示:气泡时间戳与消息状态可视化 1. 引言:当大模型遇见沉浸式聊天界面 想象一下,你正在本地部署一个强大的开源大语言模型,比如南北阁的4.1-3B版本。你通过命令行与它对话,看着…...

从相位差到厘米级精度:深入解析蓝牙6.0 CS中PBR公式的推导与验证

1. 蓝牙6.0 CS技术中的相位测距原理 蓝牙6.0引入的信道探测(CS)功能将定位精度提升到了厘米级,这主要得益于其采用的相位测距法(PBR)。想象一下,这就像用无线电波玩"激光测距",只不过我们用的是相位差而不是光脉冲。在实际操作中&a…...

5步打造Xbox 360游戏PC运行环境:Xenia Canary模拟器全攻略

5步打造Xbox 360游戏PC运行环境:Xenia Canary模拟器全攻略 【免费下载链接】xenia-canary Xbox 360 Emulator Research Project 项目地址: https://gitcode.com/gh_mirrors/xe/xenia-canary Xenia Canary作为领先的Xbox 360开源模拟器,通过精准的…...

手把手教你用Stable Diffusion v1.5:从安装到生成第一张AI图片

手把手教你用Stable Diffusion v1.5:从安装到生成第一张AI图片 1. 引言 你是否曾经想过,只需输入一段文字描述,就能让AI自动生成一张精美的图片?Stable Diffusion v1.5作为AI图像生成领域的经典模型,让这个梦想变成了…...

如何用RAKE-NLTK实现高效关键词提取:企业级文本分析解决方案

如何用RAKE-NLTK实现高效关键词提取:企业级文本分析解决方案 【免费下载链接】rake-nltk Python implementation of the Rapid Automatic Keyword Extraction algorithm using NLTK. 项目地址: https://gitcode.com/gh_mirrors/ra/rake-nltk 在信息爆炸的数字…...

Blender UV Squares终极指南:3分钟掌握UV网格重塑神器

Blender UV Squares终极指南:3分钟掌握UV网格重塑神器 【免费下载链接】UvSquares Blender addon for reshaping UV quad selection into a grid. 项目地址: https://gitcode.com/gh_mirrors/uv/UvSquares 在3D建模和纹理贴图的世界里,UV Squares…...

2026应届生面试避坑指南:避开这些致命细节,求职成功率翻倍

文章目录前言一、简历不是自传,而是广告文案第一个大坑:把简历做成PPT艺术展。第二个大坑:把简历写成流水账。第三个大坑:一份简历海投百家。二、八股文背得溜,场景题一到就露馅丢分细节一:只会背概念&…...

【新能源功率预测】别再只盯准确率了,2026真正决定收益的,是“预测+交易+储能”一体化

关键词: 新能源功率预测、电力现货交易、储能套利、AI大模型、容量电价 2026年的春天,对于新能源电站的投资人和运营者来说,可谓是“冰火两重天”。 “火”的是政策红利终于实质性落地。【发改价格】114号文将独立储能纳入容量电价体系&…...

终极指南:如何用dlssg-to-fsr3让老款RTX显卡享受帧生成技术

终极指南:如何用dlssg-to-fsr3让老款RTX显卡享受帧生成技术 【免费下载链接】dlssg-to-fsr3 Adds AMD FSR 3 Frame Generation to games by replacing Nvidia DLSS Frame Generation (nvngx_dlssg). 项目地址: https://gitcode.com/gh_mirrors/dl/dlssg-to-fsr3 …...

如何永久保存你的QQ空间记忆:GetQzonehistory完整备份指南

如何永久保存你的QQ空间记忆:GetQzonehistory完整备份指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心过,那些记录着青春岁月的QQ空间说说会随…...

FramePack完整指南:5个关键技巧解决AI视频生成难题

FramePack完整指南:5个关键技巧解决AI视频生成难题 【免费下载链接】FramePack Lets make video diffusion practical! 项目地址: https://gitcode.com/gh_mirrors/fr/FramePack 你是否曾为AI视频生成中的内存溢出、生成速度缓慢和画面漂移问题而烦恼&#x…...

破解3DS游戏格式兼容难题:3dsconv工具的技术实现与应用指南

破解3DS游戏格式兼容难题:3dsconv工具的技术实现与应用指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 问题…...

如何用iTorrent在iPhone上轻松管理种子下载?iOS种子客户端全攻略

如何用iTorrent在iPhone上轻松管理种子下载?iOS种子客户端全攻略 【免费下载链接】iTorrent Torrent client for iOS 16 项目地址: https://gitcode.com/gh_mirrors/it/iTorrent iTorrent是一款专为iOS 16设备设计的开源种子客户端,让iPhone和iPa…...

OpCore-Simplify终极指南:15分钟完成黑苹果EFI配置的智能工具

OpCore-Simplify终极指南:15分钟完成黑苹果EFI配置的智能工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 黑苹果配置一直是技术爱好者…...

3大核心功能解锁植物大战僵尸无限可能:PvZ Toolkit完全指南

3大核心功能解锁植物大战僵尸无限可能:PvZ Toolkit完全指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否曾在植物大战僵尸的生存模式中苦于资源不足?是否想过保存完…...