队列(Queue)
队列是一种先进先出的数据结构。在队列中,元素的添加(入队)通常在队列的一端进行,而元素的移除(出队)则在另一端进行。
C++标准模板库(STL)中的std::queue
是一个容器适配器,它封装了一个底层容器(如std::deque
或std::list
)来实现队列的行为。
主要操作:
-
push(T value)
:在队列的尾部添加一个元素。 -
pop()
:移除队列头部的元素。 -
front()
:访问队列头部的元素,但不移除它。 -
back()
:访问队列尾部的元素,但不移除它。 -
empty()
:检查队列是否为空。 -
size()
:返回队列中的元素数量。
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
// 入队
q.push(1);
q.push(2);
q.push(3);
// 出队
while (!q.empty()) {
std::cout << q.front() << " ";
q.pop();
}
return 0;
}
优先级队列(Priority Queue)
优先级队列是一种特殊的队列,其中每个元素都有一个优先级,出队操作总是移除优先级最高的元素。如果没有指定优先级,元素的顺序将由它们被插入的顺序决定。
C++标准模板库中的std::priority_queue
是一个容器适配器,它使用堆(通常是二叉堆)来实现优先级队列的行为。默认情况下,std::priority_queue
是一个最大堆,即优先级最高的元素(默认是最大的元素)首先被移除。如果需要最小堆,可以使用std::make_heap
和std::push_heap
等函数。
主要操作:
-
push(T value)
:在优先级队列中添加一个元素。 -
pop()
:移除优先级最高的元素。 -
top()
:访问优先级最高的元素,但不移除它。 -
empty()
:检查优先级队列是否为空。 -
size()
:返回优先级队列中的元素数量。
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
int main() {
// 默认是最大堆
std::priority_queue<int> pq;
// 入队
pq.push(10);
pq.push(20);
pq.push(5);
// 出队
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
// 创建最小堆
std::priority_queue<int, std::vector<int>, std::greater<int>> minPq;
// 入队
minPq.push(10);
minPq.push(20);
minPq.push(5);
// 出队
while (!minPq.empty()) {
std::cout << minPq.top() << " ";
minPq.pop();
}
return 0;
}
在上述代码中,std::priority_queue
默认是最大堆,而通过指定第三个模板参数std::greater<int>
,可以创建一个最小堆。
总结来说,队列和优先级队列都是有序容器,但它们的访问和操作方式不同。队列遵循FIFO原则,而优先级队列则根据元素的优先级进行操作。