最早见到priority_queue是在轶健学长的一段代码里。后来在山东理工的huffman树那部分,核心也是优先队列
这是STL封装好的一种容器,排序原理目前才疏学浅并不了解。相当于在队列中为每个元素定义了一个优先权,根据权值对每个元素排列。
下面主要总结一下定义方式的操作函数
(1) 优先队列的基础
头文件:#include<queue>
简单来说就是自定义优先级的队列,从大到小(最大项优先)或者从小到大(最小项优先)
定义类型分为默认优先关系优先队列,自定义比较结构的优先队列,自定义结构体类型优先队列,头文件functional内定义优先级的优先队列
(2) 优先队列的常用操作
优先级队列支持的操作 |
q.empty() 如果队列为空,则返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队首元素,但不返回其值 q.top() 返回具有最高优先级的元素值,但不删除该元素 q.push(item) 在基于优先级的适当位置插入新元素 |
q.top()为确定优先级最高的元素,在最小优先队列中搜索优先权最小的元素,在最大优先队列中搜索优先权最大的元素。
优先队列插入和删除元素的复杂度都是O(logn)
另外,在优先队列中,元素可以具有相同的优先权。
代码:(修改自网上博客)
#include<iostream>
#include<cstdio>
#include<queue>
#include<functional>///geater/less
#include<vector>///去掉不影响
using namespace std;
//定义比较结构
struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
struct cmp2{
bool operator ()(int &a,int &b){
return a<b;//最大值优先
}
};
//自定义数据结构
struct n1{
int x;
bool operator < (const n1 &a) const {
return x>a.x;//最小值优先
}
};
struct n2{
int x;
bool operator < (const n2 &a) const {
return x<a.x;//最大值优先
}
};
n1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
n2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};
int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
int main()
{
priority_queue<int>que;//采用默认优先级构造队列(从大到小)
priority_queue<int,vector<int>,cmp1>que1;//最小值优先
priority_queue<int,vector<int>,cmp2>que2;//最大值优先
priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,从小到大
priority_queue<int,vector<int>,less<int> >que4;////从大到小
///定义结构体类型优先队列
priority_queue<n1>que5; //最小优先级队列
priority_queue<n2>que6; //最大优先级队列
int i;
for(i=0;a[i];i++){
que.push(a[i]);
que1.push(a[i]);
que2.push(a[i]);
que3.push(a[i]);
que4.push(a[i]);
}
for(i=0;num1[i].x;i++)
que5.push(num1[i]);
for(i=0;num2[i].x;i++)
que6.push(num2[i]);
printf("采用默认优先关系:\n(priority_queue<int>que;)\n");
printf("******0******:\n");
while(!que.empty()){
printf("%3d",que.top());
que.pop();
}
printf("\n\n");
printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");
printf("******1******:\n");
while(!que1.empty()){
printf("%3d",que1.top());
que1.pop();
}
printf("\n");
printf("******2******:\n");
while(!que2.empty()){
printf("%3d",que2.top());
que2.pop();
}
printf("\n\n");
printf("采用头文件<functional>内定义优先级:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");
printf("*****3******:\n");
while(!que3.empty()){
printf("%3d",que3.top());
que3.pop();
}
printf("\n");
printf("******4******:\n");
while(!que4.empty()){
printf("%3d",que4.top());
que4.pop();
}
printf("\n\n");
printf("采用结构体自定义优先级方式二:\n(priority_queue<number>que)\n");
printf("******5******:\n");
while(!que5.empty()){
printf("%3d",que5.top());
que5.pop();
}
printf("\n");
printf("******6******:\n");
while(!que6.empty()){
printf("%3d",que6.top());
que6.pop();
}
printf("\n");
return 0;
}
/*
运行结果 :
(priority_queue<int>que;)
83 72 56 47 36 22 14 10 7 3
(priority_queue<int,vector<int>,cmp>que;)
1:
7 10 14 22 36 47 56 72 83 91
2:
83 72 56 47 36 22 14 10 7 3
(priority_queue<int,vector<int>,greater<int>/less<int> >que;)
3:
7 10 14 22 36 47 56 72 83 91
4:
83 72 56 47 36 22 14 10 7 3
(priority_queue<number>que)
5:
7 10 14 22 36 47 56 72 83 91
6:
83 72 56 47 36 22 14 10 7 3
*/