【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() | 判断栈是否为空,空返回 true | if(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() | 判断队列是否为空,空返回 true | if(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 是啥?
🗳️ 【投票】 您的投票是支持我前行的动力
技术没有标准答案,让我们一起用最有趣的方式,写出最靠谱的代码! 🎮💻