queue(队列)
一种先进先出的数据结构
1、头文件
#include<queue>
using namespace std;
2、定义
queue<int>qu;
queue<int>qu[manx];//qu[0]~qu[manx-1]中的每一个都是一个容器
queue<queue<int> >qu;//>>之间要加空格
//类型名也可以是int、double、char,或者STL标准容器:vector、queue等
3、访问
在STL的queue中只能通过front()来访问栈顶元素
4、常用函数(见表格)
5、示例(见代码)
6、用途
当需要实现广度优先搜索时,可以用queue代替手动实现队列,提高程序的准确性
基本操作 | 复杂度 | |
---|---|---|
push() | push(x)表示将x入队 | O(1) |
front() | 获得队首元素 | O(1) |
back() | 获得队尾元素 | O(1) |
pop() | 移除栈顶元素 | O(1) |
empty() | 检测queue是否为空,为true空返回 | O(1) |
size() | 返回queue中元素的个数 | O(1) |
#include<algorithm>
#include<stdio.h>
#include <iostream>
#include<queue>
using namespace std;
queue<int>qu;
int main()
{
qu.push(12);//加入队列
qu.push(1);
qu.push(5);
qu.push(9);
cout<<qu.size()<<endl;
while(!qu.empty())//非空
{
printf("%d ",qu.front());//队首
qu.pop();//弹出
}
cout<<endl;
}
补充:另外两种与队列有关的容器
priority_queue(优先队列)
使用堆实现的默认将当前队列优先级最高的元素置于队首的容器
1、与queue的区别:
(1)定义:priority_queue< int >qu;
(2)访问:优先队列没有front()和back()函数,只能通过top()访问队首元素
2、示例:
#include<algorithm>
#include<stdio.h>
#include <iostream>
#include<queue>
using namespace std;
priority_queue<int>qu;
int main()
{
qu.push(12);//加入队列
qu.push(1);
qu.push(5);
qu.push(9);
cout<<qu.size()<<endl;
while(!qu.empty())//非空
{
printf("%d ",qu.top());//队首
qu.pop();//弹出
}
cout<<endl;
}
3、priority_queue内元素优先级设置
(1)基本数据类型的优先级设置(int、double、char等)
less< int >表示数字大的有优先级越大,greater< int >相反
这两种定义时等价的
priority_queue<int>qu;
priority_queue<int,vector<int>,less<int> >qu;
如果想让优先队列总是把最小的元素放队首,则定义如下
priority_queue<int,vector<int>,greater<int> >qu;
(2)结构体的优先级设置
重载小于号
struct node
{
char name[10];
int age;
int heigth;
friend bool operator<(node a,node b)//重载小于号“<”
{
return a.age>b.age;//年龄小的优先级高
}
};
sort(line,line+n);
priority_queue<node>qu;
写在外面:用struct包装一个cmp函数
struct node
{
char name[10];
int age;
int heigth;
};
struct cmp
{
bool operator()(node a,node b)//friend去掉,“<”换成“()”
{
return a.age>b.age;
}
}
sort(line,line+n,cmp());
priority_queue<node,vector<node>,cmp>qu;
或:
struct node
{
char name[10];
int age;
int heigth;
};
bool operator<(node a,node b)
{
return a.age<b.age;
}
sort(line,line+n);
priority_queue<node>qu;
注:当结构体内数据较为庞大时,建议用引用来提高效率,即比较类的参数中加上const和&
friend bool operator<(const node &a,const node &b)
bool operator()(const node &a,const node &b)
4、用途
(1)解决一些贪心问题
(2)优化Dijkstra算法
deque
示例:
#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
deque<int>dq;
int main()
{
dq.push_back(1);
dq.push_back(2);
dq.push_back(3);//插入队尾
dq.push_front(0);//插入队首
while(!dq.empty())
{
printf("%d ",dq.front());//首
dq.pop_front();//pop首
}
printf("\n");
dq.push_back(1);
dq.push_back(2);
dq.push_back(3);
dq.push_front(0);
while(!dq.empty())
{
printf("%d ",dq.back());//尾
dq.pop_back();//pop尾
}
}