c++优先队列priority_queue

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

队列是一种先进先出的数据结构,而优先队列是其中的一个


一、priority_queue是什么?

C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。

二、使用步骤

1.优先级队列的定义

代码如下(示例):

#include<queue>
using namespace std;
priority_queue<typename, container, functional>
其中


typename是数据的类型container是容器类型,可以是vector,queue等用数组实现的容器,不能是list,默认可以用vector;
functional是比较的方式,默认是大顶堆(就是元素值越大,优先级越高);如果使用C++基本数据类型,可以直接使用自带的lessgreater这两个仿函数(默认使用的是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;
}

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值