STL——栈、队列和优先队列
C++标准模板库(STL)提供了丰富的数据结构,其中栈(stack)、队列(queue)和优先队列(priority_queue)是常用的容器适配器。它们各自有不同的应用场景和特点。本文将详细介绍它们的定义、用法及适用场景。
一、栈(Stack)
栈是一种后进先出(LIFO, Last In First Out)的数据结构。STL中的 std::stack
容器适配器提供了栈的接口。
1. 栈的基本操作
- push:将元素推入栈顶。
- pop:移除栈顶元素。
- top:访问栈顶元素。
- empty:检查栈是否为空。
- size:返回栈中元素的数量。
2. 栈的使用示例
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
// 推入元素
s.push(1);
s.push(2);
s.push(3);
// 访问和移除栈顶元素
while (!s.empty()) {
std::cout << "Top element: " << s.top() << std::endl;
s.pop();
}
return 0;
}
3. 栈的适用场景
栈适用于需要后进先出的场景,例如:
- 括号匹配
- 深度优先搜索(DFS)
- 递归调用的模拟
二、队列(Queue)
队列是一种先进先出(FIFO, First In First Out)的数据结构。STL中的 std::queue
容器适配器提供了队列的接口。
1. 队列的基本操作
- push:将元素推入队尾。
- pop:移除队首元素。
- front:访问队首元素。
- back:访问队尾元素。
- empty:检查队列是否为空。
- size:返回队列中元素的数量。
2. 队列的使用示例
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
// 推入元素
q.push(1);
q.push(2);
q.push(3);
// 访问和移除队首元素
while (!q.empty()) {
std::cout << "Front element: " << q.front() << std::endl;
q.pop();
}
return 0;
}
3. 队列的适用场景
队列适用于需要先进先出的场景,例如:
- 广度优先搜索(BFS)
- 任务调度
- 打印队列
三、优先队列(Priority Queue)
优先队列是一种每次取出的元素都是具有最高优先级的元素的数据结构。STL中的 std::priority_queue
提供了优先队列的接口。
1. 优先队列的基本操作
- push:将元素推入优先队列。
- pop:移除具有最高优先级的元素。
- top:访问具有最高优先级的元素。
- empty:检查优先队列是否为空。
- size:返回优先队列中元素的数量。
2. 优先队列的使用示例
#include <iostream>
#include <queue>
int main() {
std::priority_queue<int> pq;
// 推入元素
pq.push(3);
pq.push(1);
pq.push(4);
pq.push(1);
pq.push(5);
pq.push(9);
// 访问和移除具有最高优先级的元素
while (!pq.empty()) {
std::cout << "Top element: " << pq.top() << std::endl;
pq.pop();
}
return 0;
}
3. 优先队列的适用场景
优先队列适用于需要快速访问最高优先级元素的场景,例如:
- 任务调度
- 最短路径算法(如Dijkstra算法)
- 事件驱动的模拟
四、总结
通过上述内容,我们详细介绍了C++ STL中的栈、队列和优先队列的定义、基本操作及适用场景。理解和掌握这些数据结构对于编写高效、清晰的代码至关重要。以下是对它们的概述:
- 栈(stack) :后进先出,适用于递归、括号匹配等场景。
- 队列(queue) :先进先出,适用于广度优先搜索、任务调度等场景。
- 优先队列(priority_queue) :每次取出最高优先级元素,适用于任务调度、最短路径算法等场景。
五、思维导图
STL 容器适配器
│
├── 栈(stack)
│ ├── push
│ ├── pop
│ ├── top
│ ├── empty
│ └── size
│
├── 队列(queue)
│ ├── push
│ ├── pop
│ ├── front
│ ├── back
│ ├── empty
│ └── size
│
└── 优先队列(priority_queue)
├── push
├── pop
├── top
├── empty
└── size
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。