前言
队列是个好东西,可以手写,也可以用C++自带的queue头文件来写。
定义队列
#include<queue>
FIFO队列
queue <类型> 变量名
1 2 3
| queue <int> que queue <char> a queue <data> c
|
优先队列
priority_queue <类型> 变量名;
1 2
| priority_queue <int> heap; priority_queue <double> k;
|
这两种定义方式都是大根堆,转为小根堆有两种方法:
一是每个数据都乘以-1;
二是自定义数据类型:
1 2 3 4 5 6 7
| struct 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】(合并果子)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<cstdio> #include<iostream> #include<queue> using 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; }
|