非常希望在不远的明天,我的晚安可以亲口说,可以先亲一口再说。
优先队列是什么呢?优先队列其实是一种特殊的队列,对队列的元素按照一定的先后顺序,队列自动排序,这就是优先队列。
话不多说直接上代码。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int > q;
q.push(4);
q.push(10);
q.push(6);
q.push(1);
q.push(15);
while(!q.empty())
{
int a = q.top();
cout<<a<<" ";
q.pop();
}
return 0;
}
// 结果为 15 10 6 4 1
我们发现对int的类型的数据默认从大到小排序,如果从小到大呢?这就需要我们重新定义优先队列的优先顺序,好像叫重载运算符。
好,我们现在开始重载”<”小于运算符。运用结构体重载。
输入 : 5 4 3 2 1
输出 :1 2 3 4 5
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
friend bool operator < (node a,node b)//friend 友元函数
{
return a.x > b.x;
}
};
int main()
{
priority_queue<node> p;
node a;
for(int i=5;i>=1;i--)
{
a.x =i;
p.push(a);
}
while(!p.empty())
{
int y = p.top().x;
cout<<y<<" ";
p.pop();
}
return 0;
}
以上就是优先队列对int的类型的队列优先级重载。
如果对数组使用优先队列就比较简单了。
priority_queue<int ,vector< int > , less< int > > m;
priority_queue< int ,vector< int > , greater< int > > n;
以上就是对数组使用的优先队列,简单吧,就几行代码。
注意:这里有一个坑,一定要注意呦。”>>”编译器会把他识别为右移运算符,两个”>”号之间要有空格!!!
好了,上样例。
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int a[5] = {10,2,69,100,-5};
int main()
{
priority_queue<int ,vector<int >,less<int > > n;
priority_queue<int ,vector<int >,greater<int > > m;
for(int i =0;i<5;++i)
{
n.push(a[i]);
m.push(a[i]);
}
while(!n.empty())
{
cout<<n.top()<<" ";n.pop();
cout<<endl;
}
while(!m.empty())
{
cout<<m.top()<<" ";
m.pop();
cout<<endl;
}
return 0;
}
运行之后不难发现,less< int > 是从大到小排列。greater< int >是从小到大排列。
我目前就自学这么多,还有许多更高级的用法,后续默默的补上>>>>