queue
定义与特性
队列(queue)是一种先进先出(FIFO, First In First Out)的线性表。它只允许在表的一端进行插入操作,而在另一端进行删除操作。队列的插入端称为队尾(rear),删除端称为队首(front)。当队列中没有元素时,称为空队列。
基本操作
- push(x): 将元素x插入到队尾。
- front(): 返回队首元素的引用,但不删除它。
- back(): 返回队尾元素的引用,但通常不用于队列操作,因为队列的设计原则是先进先出。
- pop(): 移除队首元素,并返回(或不返回)该元素的值。
- empty(): 检查队列是否为空,如果为空则返回true,否则返回false。
- size(): 返回队列中元素的个数。
实现方式
队列的实现方式主要有两种:
1.基于顺序表(数组):在这种实现中,队列的尾部可能随着元素的插入而不断移动,导致需要频繁地进行数据搬移。为了避免这种情况,可以使用循环队列来优化。
2.基于链表:链表实现的队列在插入和删除操作时通常具有更好的性能,因为不需要移动元素。
实例
#include <iostream>
#include <queue> // 包含queue的头文件
int main() {
// 创建一个int类型的队列
std::queue<int> myQueue;
// 向队列中添加元素(入队)
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
// 查看队列是否为空
if (!myQueue.empty()) {
std::cout << "队列不为空" << std::endl;
}
// 查看队列的大小
std::cout << "队列大小: " << myQueue.size() << std::endl;
// 查看队首元素(不移除)
std::cout << "队首元素: " << myQueue.front() << std::endl;
// 移除队首元素(并不返回该元素)
myQueue.pop();
// 再次查看队首元素(现在应该是20)
std::cout << "移除元素后,新的队首元素: " << myQueue.front() << std::endl;
// 遍历队列中的所有元素(虽然queue没有直接的遍历方法,但可以通过循环pop和push到另一个容器来实现)
std::queue<int> tempQueue;
while (!myQueue.empty()) {
tempQueue.push(myQueue.front());
myQueue.pop();
std::cout << "遍历中的元素: " << tempQueue.front() << std::endl;
tempQueue.pop(); // 遍历后立即从tempQueue中移除元素,以保持tempQueue为空
}
return 0;
}
priority_queue
定义与特性
优先队列(priority_queue)是一种特殊的队列,其中每个元素都被赋予了一个优先级。元素的出队顺序是根据它们的优先级来决定的,而不是它们被插入到队列中的顺序。在默认情况下,最高优先级的元素会被首先移除(即,对于最大堆实现的优先队列,最大的元素会被首先移除)。
基本操作
- push(x): 将元素x插入到优先队列中。
- top(): 返回队列中具有最高优先级的元素,但不从队列中移除它。
- pop(): 移除并返回队列中具有最高优先级的元素。
- empty(): 检查优先队列是否为空,如果为空则返回true,否则返回false。
- size(): 返回优先队列中元素的个数。
实现方式
优先队列通常通过堆(heap)来实现,堆是一种特殊的完全二叉树,其中每个父节点的值都大于或等于(或小于或等于,取决于堆的类型)其子节点的值。在C++的STL中,priority_queue默认是一个最大堆。
实例
递增(最大堆)
```c
#include <iostream>
#include <queue>
#include <vector>
int main() {
// 创建一个int类型的最大堆
std::priority_queue<int> maxHeap;
// 向最大堆中添加元素
maxHeap.push(10);
maxHeap.push(30);
maxHeap.push(20);
maxHeap.push(5);
// 查看并移除最大元素
while (!maxHeap.empty()) {
std::cout << "最大元素: " << maxHeap.top() << std::endl;
maxHeap.pop();
}
// 此时maxHeap为空
return 0;
}
递减(最小堆)
使用了std::priority_queue的第三个模板参数来指定一个比较对象。使用了
std::greater,它是一个函数对象,当第一个参数小于第二个参数时返回
true,这与priority_queue期望的比较函数(当第一个参数“大于”第二个参数时返回
true)相反,因此得到堆表现为最小堆。
#include <iostream>
#include <queue>
#include <vector>
#include <functional> // 对于std::greater
int main() {
// 使用std::greater<int>创建一个int类型的最小堆
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
// 向最小堆中添加元素
minHeap.push(10);
minHeap.push(30);
minHeap.push(20);
minHeap.push(5);
// 查看并移除最小元素
while (!minHeap.empty()) {
std::cout << "最小元素: " << minHeap.top() << std::endl;
minHeap.pop();
}
// 此时minHeap为空
return 0;
}