C++ 优先队列

Posted mzyczly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 优先队列相关的知识,希望对你有一定的参考价值。

优先队列工作原理: 自动排序的队列
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++ 优先队列的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

(c++)迷宫自动寻路-队列-广度优先算法-附带寻路打印动画

为啥我需要在 C++ 中使用不同的排序格式来对这个 USACO 代码上的数组和优先级队列进行排序?

优先级队列未正确比较 C++

C++ 优先级队列“更大”选项不起作用