优先队列的构造以及使用方法的总结(for priority_queue)

来源:互联网 发布:绣花制版软件区别 编辑:程序博客网 时间:2024/05/27 09:44

上篇简要介绍了队列,而现实生活中,在一个队列中我们往往希望得到该队列中最好元素排名次序。比如,一个竞赛的成绩组成一个队列,那我们可能会首先关注的就是谁是冠军,换言之就是谁是这个队列中的最大元素,这个时候普通的队列就解决起来比较麻烦了,用优先队列可以很方便的解决问题。

关于优先队列:从它的名字可以看出来,它的本质是一种队列,但是前面的修饰语“优先”有决定了它是一种特殊的队列!

特性:它不同于队列中的先进先出的原则,从优先队列中每次取出的都是优先权最高的元素。(优先权是我们根据具体情况设定的,可以是最大、最小、最长等等)

声明的头文件:#include"queue";

成员函数:它的成员函数:empty、size、pop、push、top

它的成员函数(除了top)和queue的使用方法都一样这里不再赘述 详细参见queue的成员函数

这里只说top,top函数就是获取队列中优先权最高的那个元素,相当于queue里的front,只不过它有优先权,所以重新命名为了top。

 

首先看第一种最长用最简单的构造使用方法:

priority_queue<int>q;

priority_queue 说明是定义的是优先队列;int队列中存储的元素数据类型;q用户定义的队列名称;

这种定义的特性:该种定义环境下,优先权默认是根据数据类型决定的,比如int ,值大的元素优先权就越高。

#include<iostream>#include<string>#include<queue>using namespace std;int main(){    priority_queue<int>first;priority_queue<char>second;int i;for(i=0;i<8;i++)first.push(i);int max=first.top();second.push('a');second.push('b');second.push('c');char max_c=second.top();cout<<"max="<<max<<endl;cout<<"max_c="<<max_c<<endl;return 0;}


 

那如果是队列的元素是时间呢?我们大多数情况往往需要计算的是最小时间,那么我们如何实现数值越小优先权越高呢?

这时,我们可以自定义优先权!目前,我学到的通常是通过定义struct型的来完成的,呵呵学艺不精,以后学了其他的在添加吧!

struct node{
  friend bool operator<(node a,node b)

  {
             return a.time>b.time;

   }
};

这里我们主要是通过运算符的重载进行的,在node内声明一个友元函数,该函数重新定义了‘<’,即时间长的<时间短的。

 

 

#include<iostream>#include<string>#include<queue>using namespace std;struct node{friend bool operator<(node a, node b)//这里我们进行了元算符的重载,重新定义了<{return a.time>b.time;//时间长的比时间短的优先级低(重新定义了优先级)}int time;}s[20];int main(){priority_queue<node>q;int i;for(i=0;i<10;i++){s[i].time=i;q.push(s[i]);}while(!q.empty()){node min=q.top();cout<<min.time<<" ";q.pop();}cout<<endl;return 0;}


 

 第三种呢?我在程序中还没有使用过。边学边总结吧!

这种方法主要是引入比较函数。首先我们要了解两种比较函数:less,greater;

他们都存在与头文件“functional”中。

他们的实现方法这里不在探究,用在队列中就是,less大到小排列,greater从小到大排列。

priority_queue<int, vector<int>,greater<int>  >  //升序排列,最小的元素优先权最高

priority_queue<int,vector<int>,less<int>  >  //降序排列,最大的元素优先权最高

#include<iostream>#include<string>#include<queue>#include<vector>#include<functional>using namespace std;int main(){int num[10]={0,1,2,3,4,5,6,7,8};priority_queue<int,vector<int>,greater<int> > max;//注意这里的写法,不能写成priority_queue<int,vector<int>,greater<int>> priority_queue<int,vector<int>,less<int> > min;for(int i=0;i<=8;i++){max.push(num[i]);min.push(num[i]);}while(!max.empty()){cout<<max.top()<<" ";max.pop();}cout<<endl;while(!min.empty()){cout<<min.top()<<" ";min.pop();}cout<<endl;return 0;} 


 

 

 

原创粉丝点击