树形结构 —— 优先队列
【概述】
priority_queue(优先队列)是定义在 <queue> 头文件中的一个模板类,其底层是用堆来实现的。
与 queue(队列)相比,优先队列不是按照入队顺序出队,而是按照队列中元素的优先权出队。默认情况下,按照大者优先的顺序出队,也可以指定算子来指定所需的优先顺序。
关于堆:点击这里
【定义】
定义: priority_queue<elemType, conType, greater/less> priority_queueName
参数:第一个是元素类型,第二个是容器类型,第三个是比较算子,后两个均可省略,默认容器为 vector,默认算子为 less(小的向前排,大的向后排,出队时序列尾元素先出队)
priority_queue<int> q1; //定义数据类型为int,默认大的先出队
priority_queue< pair<int,int> > q2; //定义数据类型为pair,默认大的先出队
priority_queue<int, vector<int>, greater<int> > q3; //定义小的先出队
【比较算子的定义】
如果要定义自己的比较算子,方法有很多种,最常见的一种是:重载比较运算符。
将两个元素 x 和 y 代入比较运算符 (对 less 算子,调用 x<y,对 greater 算子,调用 x>y),若结果为真,则 x 排在 y 前面,y 将先于 x 出队,反之,则将 y 排在 x 前面,x 将先出队。
例如:
1)按照 z 的顺序从大到小出队:
/*运行结果:3 3 62 2 51 5 44 4 3
*/
#include<iostream>
#include<queue>
using namespace std;
struct T{int x,y,z;T(int a, int b, int c):x(a), y(b), z(c){}bool operator < (const T &t1, const T &t2) const {return t1.z<t2.z; //按照z的顺序来决定t1和t2的顺序}
};
int main(){priority_queue<T> q;q.push(T(4,4,3));q.push(T(2,2,5));q.push(T(1,5,4));q.push(T(3,3,6));while (!q.empty()){T t=q.top();q.pop();cout<<t.x<<" "<<t.y<<" "<<t.z<<endl;}return 0;
}
2)按照 z 的顺序从小到大出队
/*运行结果:4 4 31 5 42 2 53 3 6
*/
#include<iostream>
#include<queue>
using namespace std;
struct T{int x,y,z;T(int a, int b, int c):x(a), y(b), z(c){}bool operator > (const T &t1, const T &t2) const {return t1.z>t2.z; //按照z的顺序来决定t1和t2的顺序}
};
int main(){priority_queue< T,vector<T>,greater<T> > q;q.push(T(4,4,3));q.push(T(2,2,5));q.push(T(1,5,4));q.push(T(3,3,6));while (!q.empty()){T t=q.top();q.pop();cout<<t.x<<" "<<t.y<<" "<<t.z<<endl;}return 0;
}
【基本操作】
priority_queue 的基本操作与 queue 相同:
- q.push(x):入队,将 x 存入队列末端
- q.pop():出队,将队列的第一个元素弹出
- q.front():访问队首元素
- q.back():访问队尾元素
- q.empty():判断队列是否为空,当队列为空时返回 true,否则返回 false
- q.size():访问队列中元素的个数
【例题】
- 合并果子(信息学奥赛一本通-T1369):点击这里
- 看病(信息学奥赛一本通-T1371):点击这里
- 鱼塘钓鱼(信息学奥赛一本通-T1373):点击这里
- Reorder the Array(CF-1008C):点击这里
- Fence Repair(POJ-3253):点击这里
- 活动安排问题(51Nod-1428):点击这里
- Stall Reservations(POJ-3190):点击这里
- Supermarket(POJ-1456):点击这里
- 玩具(BZOJ-1307)(queue+priority_queue):点击这里
- 3N Numbers(AtCoder-2566)(两次 priority_queue):点击这里
- The Average(POJ-2833)(两次 priority_queue):点击这里
树形结构 —— 优先队列相关推荐
- 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...
- 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树...
上篇文章我们主要介绍了线性数据结构,本篇233酱带大家康康 无所不在的非线性数据结构之一:树形结构的特点和应用. 树形结构,是指:数据元素之间的关系像一颗树的数据结构.我们看图说话: 它具有以下特点: ...
- 树形结构在关系数据库中的设计
在程序设计中,经常以树形结构表示数据的层次关系,如菜单的结构.商品的分类等. 这样的层次结构在关系数据库中难以直观地表示.常见的一种做法是用一个字段指向上级节点来表示记录的上下级关系. fid pid ...
- html树状结构怎么展开,纯css实现树形结构
纯css实现属性结构 **css实现属性结构的思路是利用伪类实现树形结构连接线,如果想实现点击展开和收 缩以及复选框效果还得配合js来实现.其实展开和收缩就是一个点击元素其子元素隐藏 和显示的切换.* ...
- 使用树形结构保存实体
阅读原文请访问我的博客BrightLoong's Blog 之前在项目需要实现一个功能--将xml文件映射成实体,然后对映射的实体进行逻辑处理,最后保存到数据库中:由于xml结构的数据是结构化的数据, ...
- 在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家.这是winform中的例子. 在进行拖放操作之前 ...
- Java8 Stream流递归,几行代码搞定遍历树形结构
欢迎关注方志朋的博客,回复"666"获面试宝典 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中 ...
- 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件
看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...
- vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...
最新文章
- 远程重启h3c路由器_【一号机房】教你怎么配置H3C路由器NAT及远程telnet
- 写段QTP脚本与大家一起分享
- 红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事
- win7系统定时删除数据的批处理命令_使用bat批处理命令清理windows7系统垃圾文件...
- 用原生JS写PHP里的Ajax
- Java Socket 通信实例 - 转载
- oa软件测试用例,OA系统测试用例.doc
- 吉他调音软件 android,吉他调音器专业版
- 【无标题】Win10鼠标单击右键点击“显示设置”,“个性化”弹出该文件没有与之关联的程序来执行该操作。
- tiny4412开发板Android篇_3基于tiny4412的Android系统的烧写(SD卡烧写到emmc)
- 详解区块链(很详很长)
- 《谁动了我的奶酪》读后感 他人感悟
- html5设置单元格行高,单元格的行高怎么设置 EXCEL文档怎么统一设置行高
- 跨域(cross-domain)访问 cookie (读取和设置)
- cuda10.1安装
- linux php7.4,PHP 7.4登陆Ubuntu 20.04 LTS
- python实现外星人入侵——3.事件分析
- 2020年第十七届中国研究生数学建模竞赛B题 -解题思路
- 小米android11适配计划,小米、vivo、一加等宣布Android 11 beta版本适配计划
- 1169 分数系列