C++ STL中的栈与队列:核心原理与实战应用指南
C++ STL中的栈与队列:核心原理与实战应用指南
在C++标准模板库(STL)中,stack(栈)和queue(队列)是两个重要的容器适配器,它们通过封装底层容器(默认使用deque)实现了特定的数据操作逻辑。本文将深入探讨它们的设计原理、常用操作及典型应用场景,帮助开发者快速掌握其核心用法。
一、栈(stack):后进先出的数据管理
核心特性与初始化
栈遵循后进先出(LIFO)原则,仅允许在栈顶进行插入和删除操作。其底层通常基于deque或list容器实现。
include <stack>
std::stack<int> s; // 默认基于deque的整型栈
常用操作及示例
方法 功能描述 示例代码
push(x) 将元素x压入栈顶 s.push(10);
pop() 移除栈顶元素(不返回值) s.pop();
top() 返回栈顶元素的引用(需非空检查) int val = s.top();
empty() 判断栈是否为空(返回布尔值) if (s.empty()) {...}
size() 返回栈中元素数量 int cnt = s.size();
操作示例:遍历栈并输出所有元素
std::stack<int> s;
s.push(1); s.push(2); s.push(3);
while (!s.empty()) {
std::cout << s.top() << " "; // 输出:3 2 1
s.pop();
典型应用场景
括号匹配:通过栈结构检测表达式中的括号嵌套是否正确
深度优先搜索(DFS):递归算法中隐式使用栈管理访问路径
撤销操作:文本编辑器中按顺序记录操作步骤
二、队列(queue):先进先出的任务调度
核心特性与初始化
队列遵循先进先出(FIFO)原则,元素在队尾插入,队首删除。底层同样基于deque或list实现。
include <queue>
std::queue<std::string> q; // 字符串队列
常用操作及示例
方法 功能描述 示例代码
push(x) 将元素x插入队尾 q.push("task1");
pop() 移除队首元素(不返回值) q.pop();
front() 返回队首元素的引用(需非空检查) auto task = q.front();
back() 返回队尾元素的引用 auto last = q.back();
empty() 判断队列是否空 if (q.empty()) {...}
size() 返回队列元素数量 int len = q.size();
操作示例:处理任务队列
std::queue<int> q;
q.push(10); q.push(20); q.push(30);
while (!q.empty()) {
std::cout << q.front() << " "; // 输出:10 20 30
q.pop();
典型应用场景
广度优先搜索(BFS):按层次遍历树或图结构
消息队列:异步处理系统中的任务缓冲
打印任务调度:保证文档按提交顺序打印
三、进阶扩展:优先队列(priority_queue)
优先队列是队列的变种,元素按优先级排序(默认最大堆)。常用于任务调度系统:
include
// 小顶堆示例
std::priority_queue<int, std::vector
pq.push(3); pq.push(1); pq.push(4);
pq.top(); // 返回1(当前最小元素)