提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
前言
队列是一种先进先出的数据结构,而优先队列是其中的一个
一、priority_queue是什么?
C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。
二、使用步骤
1.优先级队列的定义
代码如下(示例):
#include<queue>
using namespace std;
priority_queue<typename, container, functional>
其中
typename是数据的类型;
container是容器类型,可以是vector,queue等用数组实现的容器,不能是list,默认可以用vector;
functional是比较的方式,默认是大顶堆(就是元素值越大,优先级越高);如果使用C++基本数据类型,可以直接使用自带的less和greater这两个仿函数(默认使用的是less,就是构造大顶堆,元素小于当前节点时下沉)。使用自定义的数据类型的时候,可以重写比较函数,也可以进行运算符重载(less重载小于“<”运算符,构造大顶堆;greater重载大于“>”运算符,构造小顶堆)。
2.函数及其作用
empty() | 如果优先队列为空,则返回真 |
pop() | 删除第一个元素 |
push() | 加入一个元素 |
size() | 返回优先队列中拥有的元素的个数 |
top() | 返回优先队列中有最高优先级的元素 |
3.优先队列
1.基本数据类型的优先队列
priority_queue<int> que;//创建int类型的优先队列 for(int i=0;i<=8;i++){//读入数据 int temp; cin>>temp; que.push(temp); } while(que.size()!=0){//输出数据 cout<<que.top()<<" "; que.pop(); }
测试数据 5 4 8 6 5 47 8 9 2 输出结果 47 9 8 8 6 5 5 4 2
通过输出结果可以看出,优先队列默认优先级大的在队首。
2.自定义数据类型的优先级队列。
通过重载仿函数或者重载<来实现自定义数据类型的优先级比较。
来个例题
小理是个热爱生活的孩子。
病人登记看病,小理想编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1. 老年人(年龄 ≥≥ 60岁)比非老年人优先看病。
2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3. 非老年人按登记的先后顺序看病。
输入
第一行一个正整数n(n≤100),表示病人的个数。
接下来 n 行,每行输入一个病人的信息,包括:
一个长度为 4 的字符串表示病人的编号(每个病人的编号各不相同且只含数字和大写字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
输出共 n 行,按排好的看病顺序输出病人的编号,每行一个字符串。
样例输入
5 1075 40 4003 15 01B8 65 1GC3 75 201A 30样例输出
1GC3 01B8 1075 4003 201A
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct person{//定义病人结构体
string id;
int age;
int time;//标记进入队列的时间
friend bool operator <(const person &a,const person &b){
//重载<来判断优先级
if(a.age>=60&&b.age>=60){
if(a.age==b.age){
return a.time>b.time;
}
else
return a.age<b.age;
}
if(a.age>=60&&b.age<60){
return false;
}
if(a.age<60&&b.age>=60){
return true;
}
if(a.age<60&&b.age<60)
return a.time>b.time;
}
};
priority_queue<person> a;//创建优先级队列
int n;
int main(){
cin>>n;
//输入
for(int i=0;i<n;i++){
person temp;
cin>>temp.id>>temp.age;
temp.time=i;
a.push(temp);
}
//输出
while(a.size()!=0){
cout<<a.top().id<<endl;;
a.pop();
}
return 0;
}