前言

我们在之前的课程中已经接触了队列这个数据结构。利用队列先进先出的性质,可以解决很多实际问题,但对于一些特殊的情况,队列是无法解决的。

例如在医院里,重症急诊患者肯定不能像普通患者那样依次排队就诊。这时候,我们就需要一种新的数据结构——优先队列,,先访问优先级高的元素。

实现

在队列中,元素从队尾进入,从队首删除。相比队列,优先队列里的元素增加了优先级的属性,优先级高的元素先被删除。

优先队列的使用和队列基本上没有区别,下面给出 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 详解)

C++ priority_queue 官方文档

返回目录,查看更多