前言
我们在之前的课程中已经接触了队列这个数据结构。利用队列先进先出的性质,可以解决很多实际问题,但对于一些特殊的情况,队列是无法解决的。
例如在医院里,重症急诊患者肯定不能像普通患者那样依次排队就诊。这时候,我们就需要一种新的数据结构——优先队列,,先访问优先级高的元素。
实现
在队列中,元素从队尾进入,从队首删除。相比队列,优先队列里的元素增加了优先级的属性,优先级高的元素先被删除。
优先队列的使用和队列基本上没有区别,下面给出 C++ 实例代码。
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<int> q; // 声明一个装 int 类型数据的优先队列
q.push(1); // 入队
q.push(2);
q.push(3);
while (!q.empty()) { // 判断队列是否为空
cout << q.top() << endl; // 访问队列首元素
q.pop(); // 出队
}
return 0;
}
/* 输出为 3 2 1 */
优先队列的优先级重载
优先队列,可以存放数值,也可以存放其它数据类型(包括自定义数据类型)。该容器支持查询优先级最高的元素这一操作,而优先级的高低是可以自行定义的。
在 C++ 中我们可以通过重载小于运算符 bool operator <
来实现
比如整数,程序默认是数值较大的元素优先级较高,我们也可以定义数值较小的元素优先级较高。又比如下面的例子,在算法竞赛中经常出现,这里定义距离值较小的 node 优先级较高。
struct node {
int dist, loc;
node() { }
bool operator < (const node & a) const {
return dist > a.dist;
}
};
priority_queue <node> Q;
(课程给的不全,还是看这篇吧:优先队列 priority_queue 详解)