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

【C++】STL详解(七)—stack和queue的介绍及使用

✨ 坚持用 清晰易懂的图解 + 代码语言, 让每个知识点都 简单直观
🚀 个人主页 :不呆头 · CSDN
🌱 代码仓库 :不呆头 · Gitee
📌 专栏系列

  • 📖 《C语言》
  • 🧩 《数据结构》
  • 💡 《C++》
  • 🐧 《Linux》

💬 座右铭“不患无位,患所以立。”

在这里插入图片描述


【C++】STL详解(七)—stack和queue的介绍及使用

  • 前言
  • 目录
    • 一、stack
      • 1. stack的介绍
      • 2. stack的定义方式
        • 2.1 使用默认的适配器定义栈
        • 2.2 方式二:使用特定的适配器定义栈
      • 3.stack的使用
    • 二、queue
      • 1. queue的介绍
      • 2. queue的定义方式
        • 2.1 使用默认的适配器定义队列
        • 2.2 使用特定的适配器定义队列
      • 3.queue的使用
    • 三、总结


前言

🚀 欢迎来到《C++修炼之路》!

这里是C++程序员的成长乐园,带你领略从面向对象到现代C++的精彩世界。我们将>用简洁的代码和生动的案例,助你掌握C++核心精髓。

🔍 专栏亮点:

  • 现代C++特性解析(C++11/14/17)
  • STL源码剖析与实战应用
  • 内存管理与性能优化技巧

💡 收获预期:
✔️ 写出更健壮的C++代码
✔️ 深入理解面向对象设计
✔️ 掌握模板编程基础

📌 编程箴言:

“好的C++代码就像好酒,需要时间沉淀。”

(正文开始👇)


目录

一、stack

1. stack的介绍

在这里插入图片描述

C++98中stack 的构造函数 explicit stack(const container_type& ctnr = container_type()) 表示:stack 是一个容器适配器,内部需要一个底层容器(默认是 deque<T>)来存储元素;如果不传参数,就会默认构造一个空的底层容器来初始化空栈;如果传入一个已有容器,就会以该容器的内容来初始化栈,且栈顶对应容器的最后一个元素。这里的 explicit 关键字用来禁止隐式转换,也就是说不能直接用一个容器赋值给 stack,必须显式构造。

专门用于具有后进先出的上下文环境中,其只能从元素的一端进行插入和提取操作。
在这里插入图片描述


2. stack的定义方式

2.1 使用默认的适配器定义栈
stack<int> st1;

注意: 如果没有为stack指定特定的底层容器,默认情况下使用deque。

2.2 方式二:使用特定的适配器定义栈
stack<int, vector<int>> st2;
stack<int, list<int>> st3;

3.stack的使用

stack 常用函数速查表

函数功能说明示例
push(const T& x)元素入栈(放到栈顶)s.push(10);
pop()删除栈顶元素(不返回值)s.pop();
top()访问栈顶元素(返回引用)int x = s.top();
empty()判断栈是否为空,空返回 trueif(s.empty()) ...
size()返回栈中元素个数cout << s.size();
swap(stack& other)与另一栈交换内容s1.swap(s2);
  • stack 没有提供遍历迭代器,也没有随机访问功能。
  • 想查看所有元素,只能不断 pop() 出来。
#include<iostream>
#include<vector>
#include<stack>
using namespace std;int main()
{stack<int, vector<int>> st;stack<int, vector<int>> st1;st.push(5);st.push(2);st.push(0);st.push(2);st.push(0);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;st1.push(6);st1.push(6);st1.push(6);st.swap(st1);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;return 0;
}

测试结果:
在这里插入图片描述


二、queue

1. queue的介绍

在这里插入图片描述

queue 的构造函数 explicit queue(const container_type& ctnr = container_type()) 表示:queue 作为容器适配器,内部需要一个底层顺序容器(默认是 deque<T>)来完成先进先出的队列操作;如果不传参数,就默认用一个空的底层容器初始化一个空队列;如果传入一个已有容器,就会用该容器的内容来初始化队列,其中队首对应底层容器的第一个元素,队尾对应最后一个元素;而 explicit 关键字则用于禁止隐式转换,只能显式地通过容器构造 queue,不能直接赋值转换。

专门用在具有先进先出操作的上下文环境中,其只能从容器的一端插入元素,另一端提取元素。
在这里插入图片描述


2. queue的定义方式

2.1 使用默认的适配器定义队列
queue<int> qu;

注意: 如果没有为queue指定特定的底层容器,默认情况下使用deque。

2.2 使用特定的适配器定义队列
queue<int,vector<int>> qu1;
queue<int,list<int>> qu2;

3.queue的使用

queue 常用函数速查表

函数功能说明示例
push(const T& x)元素入队(放到队尾)q.push(10);
pop()删除队首元素(不返回值)q.pop();
front()访问队首元素(返回引用)int x = q.front();
back()访问队尾元素(返回引用)int y = q.back();
empty()判断队列是否为空,空返回 trueif(q.empty()) ...
size()返回队列中元素个数cout << q.size();
swap(queue& other)与另一队列交换内容q1.swap(q2);
  • queue 没有提供迭代器和随机访问功能。
  • 想遍历所有元素,需要不断 pop() 出队。
#include<iostream>
#include<queue>
#include<list>
using namespace std;int main()
{queue<int, list<int>> qu;queue<int, list<int>> qu1;qu.push(5);qu.push(2);qu.push(0);qu.push(2);qu.push(0);cout << qu.size() << endl;while (!qu.empty()){cout << qu.front() << " ";qu.pop();}cout << endl;qu1.push(6);qu1.push(6);qu1.push(6);qu.swap(qu1);while (!qu.empty()){cout << qu.front() << " ";qu.pop();}cout << endl;return 0;
}

在这里插入图片描述


三、总结

不是呆头梳理了 stack 与 queue 的构造方式、常用函数以及典型用法:stack 主打 后进先出(LIFO),适合用在函数调用、表达式求值等场景;queue 主打 先进先出(FIFO),常用于任务调度、消息传递等场合。它们虽然功能简单,但在实际开发中却是高效而常用的工具。掌握好这两个适配器容器,不仅能帮我们写出更清晰的逻辑结构,也能为后续深入理解 STL 更复杂的容器与算法 打下坚实基础。


不是呆头将一直坚持用清晰易懂的图解 + 代码语言,让每个知识点变得简单!
👁️ 【关注】 看一个非典型程序员如何用野路子解决正经问题
👍 【点赞】 给“不写八股文”的技术分享一点鼓励
🔖 【收藏】 把这些“奇怪但有用”的代码技巧打包带走
💬 【评论】 来聊聊——你遇到过最“呆头”的 Bug 是啥?
🗳️ 【投票】 您的投票是支持我前行的动力
技术没有标准答案,让我们一起用最有趣的方式,写出最靠谱的代码! 🎮💻


文章转载自:

http://HMFuDqJD.pLxnn.cn
http://97uFsCmo.pLxnn.cn
http://YvYAIXkU.pLxnn.cn
http://fpvq3e2E.pLxnn.cn
http://71r8Ryom.pLxnn.cn
http://7xVrq3t3.pLxnn.cn
http://5h1P2REq.pLxnn.cn
http://4D3u78AE.pLxnn.cn
http://nALP5QLp.pLxnn.cn
http://CmwN1C56.pLxnn.cn
http://xr0klB2n.pLxnn.cn
http://eA4wLHvk.pLxnn.cn
http://Wns1aseB.pLxnn.cn
http://ROkLNf1q.pLxnn.cn
http://sb6puncw.pLxnn.cn
http://ko04gTX1.pLxnn.cn
http://nl5kp8To.pLxnn.cn
http://rAvo4jOZ.pLxnn.cn
http://KDZJL8ym.pLxnn.cn
http://HHdNWEEE.pLxnn.cn
http://PSKYYvms.pLxnn.cn
http://q4jkzUAF.pLxnn.cn
http://PodU3AkW.pLxnn.cn
http://ug4KBWo4.pLxnn.cn
http://njdwBbGq.pLxnn.cn
http://s355TWr3.pLxnn.cn
http://eDjK200S.pLxnn.cn
http://tvUEBUoQ.pLxnn.cn
http://yhjONKu2.pLxnn.cn
http://6gGzNTgK.pLxnn.cn
http://www.dtcms.com/a/384331.html

相关文章:

  • 20250912在荣品RD-RK3588-MID开发板的Android13系统下拿掉卡迪屏的reset引脚的下拉复位波形
  • 在线图书借阅平台的设计与实现 —— 基于飞算JavaAI的实战开发全流程与优化实践
  • Git : 分支管理和远程仓库
  • 当传统金融遇上AI智能:AIStock系统深度技术解析
  • 大数据如何捕捉你的爱好?如何实现跨站用户行为分析?
  • 用OpenCV CSRT实现实时目标跟踪
  • 13.Linux OpenSSH 服务管理
  • 微算法科技(NASDAQ: MLGO)研发基于量子密钥图像的量子图像加密算法,提供更高安全性的图像保护方案
  • LAMP 环境部署
  • Java程序设计:Eclipse 安装和使用
  • ZooKeeper 集群高可用配置指南
  • 在天嵌 TQ3568 (Debian) 上配置并添加打印机教程
  • pcl封装10 get_area_form_boundary计算平面点云面积
  • 突破局域网限制:MongoDB远程管理新体验
  • C++学习:map/set源码剖析+利用红黑树封装map/set
  • HTML开发工具有哪些?常用HTML编辑器推荐、HTML开发工具对比与HTML调试工具实战应用
  • Redis篇章3:Redis 企业级缓存难题全解--预热、雪崩、击穿、穿透一网打尽
  • 什么区块链(Blockchain)?Rust的区块链的例子
  • LangChain4J-(5)-记忆缓存与持久化
  • 遇到 npm install报错 certificate has expired是因为淘宝镜像源(registry.npm.taobao.org)
  • Excel办公新选择:300项功能的免费插件
  • 在Excel和WPS表格中用照相机创建动态更新的数据图片
  • 开发与维护nodejs工具库或自定义npm包
  • 从企业实战中学习Appium自动化测试(一)
  • 深度理解链表:使用C++数组与下标的模拟
  • 【wpf】从 DataContext 到依赖属性:WPF 自定义控件 ImageView 的优化之路
  • Sport Network 凭借 Akamai 实现卓越成就
  • Topaz Photo AI 人工智能图像处理(Mac)
  • LeetCode 第467场周赛 第13天
  • PINN物理信息神经网络锂电池剩余寿命预测模型(内含容量特征提取+两组电池剩余寿命预测实验),MATLAB实现