优先级队列的用法(基本)

来源链接:https://blog.csdn.net/red_red_red/article/details/84559951?ops_request_misc=&request_id=&biz_id=102&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0

简介:

优先级队列是一种常见的数据结构,在《STL源码剖析》中给出的定义是:priorty_queue是以个带权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。

由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素。 
但是优先级队列中的元素并非依照被推入队列的顺序排列。而是自动依照元素的权值排列。权值最高者排在最前面。 
缺省的情况下维护的是一个大堆,即权值以从高到低排列。

因为优先级队列的内部是用堆来维护,所以很多时候我们要使用堆的情况下会选择用优先级队列来代替

优先级队列的基本操作(其实就和一般的队列是一样的):


 
 
  1. q.size(); //返回q里元素个数
  2. q.empty(); //返回q是否为空,空则返回1,否则返回0
  3. q.push(k); //在q的末尾插入k
  4. q.pop(); //删掉q的第一个元素
  5. q.top(); //返回q的第一个元素


 

 常见用法:

1.优先级判断默认使用<操作符,输出按权值从高到低顺序


 
 
  1. int main()
  2. {
  3. priority_queue< int> p1; //往队列里直接存入整型
  4. p1.push( 5);
  5. p1.push( 4);
  6. p1.push( 6);
  7. p1.push( 3);
  8. p1.push( 1);
  9. for ( int i = 0; !p1.empty(); ++i)
  10. {
  11. cout << p1.top() << " ";
  12. p1.pop();
  13. }
  14. return 0;
  15. }

输出:

6 5 4 3 1

2.权值从低到高的顺序输出(greater优先队列)

priority_queue<int, vector<int>, greater<int> > q
 
 

第一个参数为元素的类型,第二个参数为容器类型,第三个参数为比较函数(默认为less),上面的为从小到大的优先级队列,如果将greater改为less或者删去第三个参数,即为权值从大到小排列。如图。注意greater包含在头文件functional内。 

对应的还有less 优先队列

priority_queue<int,vector<int>,less<int> >q;
 
 

这其实就和一开始的优先队列一样了,也是从权值大的开始输出 

3.对结构体进行操作

有时候我们想要往队列里存储结构体,那么为了实现和内置类型一样的优先级比较,我们就必须在结构体中实现对“<”的重载。因为优先级队列在内部实现调整的时候会去找“<”操作符,如果找不到就会报错。如下所示。


 
 
  1. #include<queue>
  2. using namespace std;
  3. struct node{
  4. char s[ 15];
  5. int rank;
  6. friend bool operator < (node a,node b ){
  7. return a.rank>b.rank;
  8. }
  9. };
  10. priority_queue<node>q;

寻找大富翁(裸题)

The kth great number

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值