//新人正在学习算法 第一次发文章记录下学习之旅
//第一次更新 了解尚浅 欢迎大佬补充
一、基本概念
优先队列可拿出优先级最高的元素
优先队列的数据结构是堆,本质上一种完全二叉树,默认是大顶堆
//大顶堆 每一个结点的关键字都不小于其孩子结点
二、基本操作
//使用之前需导入库函数 #include<queue>
再导入库函数之后 使用之前需进行定义:
priority_queue<typename,container,functional> que;
- typename:数据类型
- container:容器类型 写作vector<typename>
- functional:比较方式,默认大顶堆 greater<typename>表示小顶堆 升序输出 less<typename>表示大顶堆 降序输出
优先队列的常用操作有5个:
- que.size() 无参数 有返回值 返回堆内元素数量
- que.push(x) 有参数x 无返回值 表示向堆中插入x
- que.pop() 无参数 无返回值 删除堆顶元素
- que.top() 无参数 有返回值 返回当前堆顶元素
- que.empty() 无参数 有返回值(布尔类型) 判断堆是否为空
三、进阶 对于自定义类型数据使用
struct node{
int x;
int y;
};
对于自定义结构类型,不能简单加入
例如:
priority_queue<node> que; 程序出错,程序无法识别自定义数据类型的比较方式
两种方法解决:1、在自定义的数据类型中重载运算符 2、在定义优先队列时加入比较方式
本文章目前只介绍第一种(因为第二种没了解)
struct node{
int x;
int y;
bool operator < (const node & a) const {
return x<a.x;
}
node(int xx=0,int yy=0):x(xx),y(yy){}
};
node a(4,6);
node b(7,8);
node c(1,3);
priority_queue<node> que;
que.push(a);
que.push(b);
que.push(c);
这样就将a,b,c三个数据放入到优先队列里
利用cout<<que.top().x; que.pop()将得到输出为 7(b) 4(a) 1(c)
在此说明下比较方式:
首先优先队列为空,对于a,b元素的放入,利用自定义的比较方式 可以理解为 首先是 a<b 其中a、b是自定义数据类型 将利用相应的x值进行比较 即a.x<b.x 在上方例子中a.x=4 b.x=7 为此4<7 返回true即a<b为真
则判断b的优先级比a高 此时b处于堆顶位置 后续放入c也是同理
若想要输出 1(c) 4(a) 7(b) 只需改为return x>a.x;即可
//第一次更新到此 下次再见 2023/4/2