首页 > 代码库 > STL中优先队列的使用

STL中优先队列的使用

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。我们来说一下C++的STL queue库中优先队列的使用方法。STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载<操作符。优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。

使用头文件queue。

优先队列的操作:

q.empty() 判断是否为空

q.size() 返回队列中元素的个数

q.pop() 删除队首元素,但不返回其值

q.top() 返回具有最高优先级的元素值,但不删除该元素

q.push() 在基于优先级的适当位置插入新元素

默认优先级为最大优先,除此之外共有3种自定义优先级方式。

  1 #include <iostream>
  2 #include <functional>
  3 #include <queue>
  4 #include <vector>
  5 
  6 using namespace std;
  7 
  8 struct cmp1//定义比较结构
  9 {
 10     bool operator ()(int &a,int &b)
 11     {
 12         return a>b;//最小值优先
 13     }
 14 };
 15 
 16 struct cmp2
 17 {
 18     bool operator ()(int &a,int &b)
 19     {
 20         return a<b;//最大值优先
 21     }
 22 };
 23 
 24 struct number1//自定义数据结构
 25 {
 26     int x;
 27 
 28     bool operator < (const number1 &a) const
 29     {
 30         return x>a.x;//最小值优先
 31     }
 32 };
 33 
 34 struct number2
 35 {
 36     int x;
 37 
 38     bool operator < (const number2 &a) const
 39     {
 40         return x<a.x;//最大值优先
 41     }
 42 };
 43 
 44 int main()
 45 {
 46     int n;
 47     cin>>n;
 48     int a[50];
 49     number1 num1[50];
 50     number2 num2[50];
 51     for(int i=0;i<n;i++)
 52     {
 53         cin>>a[i];
 54         num1[i].x=a[i];
 55         num2[i].x=a[i];
 56     }
 57     cout<<endl;
 58     priority_queue<int>Q0;//采用默认优先级构造队列
 59     priority_queue<int,vector<int>,cmp1>Q1;//最小值优先
 60     priority_queue<int,vector<int>,cmp2>Q2;//最大值优先
 61     priority_queue<int,vector<int>,greater<int> >Q3;//一定要有空格“> >”,“>>”会被认为错误
 62     priority_queue<int,vector<int>,less<int> >Q4;////最大值优先
 63     priority_queue<number1>Q5; //最小优先级队列
 64     priority_queue<number2>Q6;  //最大优先级队列
 65     int i;
 66     for(i=0; i<n; i++)
 67     {
 68         Q0.push(a[i]);
 69         Q1.push(a[i]);
 70         Q2.push(a[i]);
 71         Q3.push(a[i]);
 72         Q4.push(a[i]);
 73     }
 74     for(i=0; i<n; i++)
 75         Q5.push(num1[i]);
 76     for(i=0; i<n; i++)
 77         Q6.push(num2[i]);
 78     //采用默认优先关系 (priority_queue<int>que)
 79     cout<<"Queue0:"<<endl;
 80     while(!Q0.empty())
 81     {
 82         cout<<Q0.top()<<" ";
 83         Q0.pop();
 84     }
 85     cout<<endl<<endl;
 86     //采用结构体自定义优先级方式一 (priority_queue<int,vector<int>,cmp>que)
 87     cout<<"Queue1:"<<endl;
 88     while(!Q1.empty())
 89     {
 90         cout<<Q1.top()<<" ";
 91         Q1.pop();
 92     }
 93     cout<<endl;
 94     cout<<"Queue2:"<<endl;
 95     while(!Q2.empty())
 96     {
 97         cout<<Q2.top()<<" ";
 98         Q2.pop();
 99     }
100     cout<<endl<<endl;
101     //采用头文件functional内定义优先级 (priority_queue<int,vector<int>,greater<int>/less<int> >que)
102     cout<<"Queue3:"<<endl;
103     while(!Q3.empty())
104     {
105         cout<<Q3.top()<<" ";
106         Q3.pop();
107     }
108     cout<<endl;
109     cout<<"Queue4:"<<endl;
110     while(!Q4.empty())
111     {
112         cout<<Q4.top()<<" ";
113         Q4.pop();
114     }
115     cout<<endl<<endl;
116     //采用结构体自定义优先级方式二 (priority_queue<number>que)
117     cout<<"Queue5:"<<endl;
118     while(!Q5.empty())
119     {
120         cout<<Q5.top().x<<" ";
121         Q5.pop();
122     }
123     cout<<endl;
124     cout<<"Queue6:"<<endl;
125     while(!Q6.empty())
126     {
127         cout<<Q6.top().x<<" ";
128         Q6.pop();
129     }
130     cout<<endl;
131     return 0;
132 }

运行结果:

技术分享

 

STL中优先队列的使用