优先队列(queue)
优先队列在头文件在#include<queue>里,同样的也需要加using namespace std;
基本格式为priority_ queue <结构类型>队列名;
常用的几种:priority_queue<node>q;(node为结构体)
Proirity_queue<int,vector<int>,greater<int> >(注意,这里的‘> >’之间必须有空格,‘>>’是右移运算符。)
队列里面的基本操作(在队列里面要用到的):
q.push(); 在末尾插入
q.pop(); 删除第一个元素
q.empty(); 检查队列是否为空,空则返回1,不空返回0
q.top(); 返回第一个元素
q.back(); 返回末尾
q.size(); 返回队列里的元素个数
Proirity_queue<int>q;默认的是从大到小排列的。(非结构体结构)
我们依然输入五个数看一下,代码如下:
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;//定义队列q
int main()
{
q.push(7),q.push(9),q.push(3),q.push(1),q.push(2);//队列里面输入 7,9,3,1,2
while(!q.empty())
{
printf("%d ",q.top());
q.pop();
}
return 0;
}
如果是结构体的队列,如下:
node结构体有x,y规则是x小的则小,从小到大的排列为:
#include<queue>
#include<cstdio>
using namespace std;
struct node
{
int x,y;
bool operator <(const node&a)const
{
return x<a.x;
}
}k;
priority_queue<node>q;
int main()
{
k.x=10,k.y=100;q.push(k);
k.x=12,k.y=60;q.push(k);
k.x=14,k.y=40;q.push(k);
k.x=6,k.y=80;q.push(k);
k.x=8,k.y=20;q.push(k);
while(!q.empty())
{
node m=q.top();
q.pop();
printf("(%d,%d)",m.x,m.y);
}
}
答案为(14,40) (12,60) (10,100) (8,20) (6,80)
另外还有priority_queue<int , vector <int> ,less <int> >q;
和priority_queue<int , vector <int> ,greater <int> >q;
Less是从大到小,greater是从小到大;代码如下:
#include<queue>
#include<cstdio>
using namespace std;
priority_queue<int , vector<int>,less<int> >q;
priority_queue<int , vector<int>,greater<int> >p;
int a[5]={7,9,3,1,2};
int main()
{
for(int i=0;i<5;i++)
{
p.push(a[i]);
q.push(a[i]);
}
printf("less:\n");
while(!q.empty())
{
printf("%d ",q.top());q.pop();
}
printf("\ngreater:\n");
while(!p.empty())
{
printf("%d ",p.top());p.pop();
}
return 0;
}