码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 优先队列

时间:2019-05-11 00:12:56      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:最小   工作   namespace   class   列队   基本操作   pop   return   钓鱼   

优先队列工作原理: 自动排序的队列
1 . 出队:弹出最小(大)。

2.  入队:插入一个元素,并调整好顺序。

而优先队列排序有什么优势呢?如图可知。

技术图片

声明一个优先队列,先调用#include<queue>

priority_queue <int> q;        //大根堆,从大到小排序

priority_queue <int,vector<int>,greater<int>/*注意这里必须有空格*/  > q;     //小根堆,从小到大排序

5个基本操作:

q.empty()     判空: 如果队列为空,则返回真
q.pop()    弹栈: 删除对顶元素,删除第一个元素
q.push()       压栈: 加入一个元素
q.size()      尺寸: 返回优先队列中拥有的元素个数
q.top()     栈顶元素:返回优先队列队顶元素,返回优先队列中有最高优先级的元素

入门优先队列问题

#include<queue>
#include<cstdio>
using namespace std;
priority_queue <int ,vector<int>,greater<int> > q;//小根堆
int n,a,ans;
int main()
{
  scanf("%d",&n);
  for (int i=1;i<=n;i++)
  {
      scanf("%d",&a);
      q.push(a);
  }
  for (int i=1;i<=n-1;i++)
  {
      int q1=q.top();
      q.pop();
      int q2=q.top();
      q.pop();
      ans+=q1+q2;
      q.push(q1+q2);
  }
  printf("%d",ans);
 return 0;    
}

 看吧,就是一个简单贪心。

在拓展一点关于重定义的知识:

若入队的是一个结构体,怎样实现按关键字优先

大根堆示例:

priority_queue<int> q;
struct edge{
    int t,v;
    friend bool operator < (edge a,edge b)  //大根堆重载小于符号 
    {
        return a.t<b.t;         //注意是小于,大于就是小跟堆了  
    }
}e[1005];

小根堆示例:

priority_queue<int,vector<int>,greater<int> > q;
struct edge{
    int t,v;
    friend bool operator > (edge a,edge b)  //小根堆重载大于符号 
    {
        return a.t>b.t;         //注意是大于
    }
}e[1005];

所以优先队列是一种很简单的数据结构,多练就会了!~~orz

奶牛晒衣服

钓鱼

C++ 优先队列

标签:最小   工作   namespace   class   列队   基本操作   pop   return   钓鱼   

原文地址:https://www.cnblogs.com/mzyczly/p/10767872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!