前言
队列是个好东西,可以手写,也可以用C++自带的queue头文件来写。
定义队列
#include<queue>
FIFO队列
queue <类型> 变量名
|
|
优先队列
priority_queue <类型> 变量名;
|
|
这两种定义方式都是大根堆,转为小根堆有两种方法:
一是每个数据都乘以-1;
二是自定义数据类型:1234567struct data{ int x; bool operator < (const data & a)const { return a.x<x; }};priority_queue <data> q;
队列操作
此处以一个名为q的队列为例:
操作 | 用途 |
---|---|
q.empty() | 若队列为空,则返回true,否则返回false |
q.size() | 返回队列中元素的个数 |
q.pop() | 删除队首元素,但不返回其值 |
q.front() | 返回队首元素的值,但不删除该元素(仅适用于FIFO队列) |
q.back() | 返回队尾元素的值,但不删除该元素(仅适用于FIFO队列) |
q.top() | 返回具有最高优先级的元素的值(默认最大值),但不删除该元素(仅适用于优先队列) |
q.push() | 对queue,在队尾压入一个新元素 对于priority_queue,在基于优先级的适当位置插入新元素 |
简单例题
洛谷【1090】(合并果子)123456789101112131415161718192021222324252627using namespace std;int n,x,ans=0,tmp;priority_queue <int> q;int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&x); q.push(-x); } for(int i=1;i<n;++i) { tmp=q.top(); ans-=q.top(); q.pop(); tmp+=q.top(); ans-=q.top(); q.pop(); q.push(tmp); } printf("%d",ans); return 0;}