优先队列操作(priority queue)

优先队列嘛,就是队列。结束......

哈哈,优先队列本质上不是一个队列,它其实是一个,但他的操作却像是队列

关于堆的定义,可以好好看看oiwiki上的解释

优先队列的最大特点,就是数据插入时会自动排序(真的香),而且时间复杂度是logn,超快的好吧

堆,有大根堆,小根堆。那么优先队列如果按照堆来存储,那么是哪种堆呢?

当然是都可以

首先,调用一个优先队列

#include <queue>

std::priority_queue<int>que;

这是最简单的,定义一个int型的优先队列,但是很多情况下都不会是一个普通的int来存储,所以又产生了以下操作

#include <bits/stdc++.h>

using namespace std;

#define P node 

struct cmp{                              //自定义优先级
    bool operator()(P A,P B){
       return B.x > A.x ;     
        }
}

struct node{
    int x,y;
};

priority_queue< P , vector<P> , cmp >que;


我们先做好一个优先队列,再进行操作(还没定义好就先别急操作)

自定义优先级,可以记住模板(struct cmp那段),最重要的就是return那里,结构体B在优先队列的位置是在A之前的(原因我也不清楚,一直没去了解,如果有人知道,可以告诉我一下)

这个优先队列表示的就是将结构体存入que后,结构体是按node.x从大到小排列的(如果大小一样,按入队顺序)

这里给出两个可以直接替换的cmp

greater<int>
less<int>

第一个,greater就是越来越大

第二个就是越来越小

如果按照最上面代码示例调用的话,默认是less

说完了调用,自定义优先级。接下来看看优先队列的使用;

que.push()      //压队
que.top()       //返回队首元素
que.pop()       //弹出队首元素
que.size()      //返回队列长度
que.empty()     //判断是否为空,空返回1,否则返回0

这些应该很好看懂

从que.top()就能看出,他不是一个单纯的队列,因为队列应该是用front

给一个完整的代码吧

#include<bits/stdc++.h>
using namespace std;

priority_queue<int>que;

int main()
{
    que.push(5);
    que.push(2);
    que.push(9);
    que.push(7);
    que.push(1);

    cout<<que.size()<<endl;           //长度

    while(!que.empty()){              //优先队列是不能从下标访问的
        cout<<que.top()<<" ";
        que.pop();
    }

    return 0;
}

//输出
//  5
//  9  7  5  2  1
#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
    node(int x,int y):x(x),y(y){}
};

struct cmp{
    bool operator()(node a,node b){
            return b.x>a.x;
    }
};

priority_queue<node,vector<node>,cmp>que;

int main()
{

    que.push(node(2,9));
    que.push(node(5,4));
    que.push(node(7,1));
    que.push(node(1,0));
    que.push(node(5,8));

    while(!que.empty()){
        cout<<que.top().x<<" "<<que.top().y<<endl;
        que.pop();
    }

    return 0;
}

例题

https://ac.nowcoder.com/acm/contest/83317/Iicon-default.png?t=N7T8https://ac.nowcoder.com/acm/contest/83317/Ihttps://www.lanqiao.cn/problems/4445/learning/?page=1&first_category_id=1&tags=%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97icon-default.png?t=N7T8https://www.lanqiao.cn/problems/4445/learning/?page=1&first_category_id=1&tags=%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值