普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。我们来说一下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 }
复制代码
运行结果: