当前位置: 代码迷 >> 综合 >> stl—priority_queue(优先队列)
  详细解决方案

stl—priority_queue(优先队列)

热度:7   发布时间:2024-01-21 01:52:27.0

最早见到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
*/