STL中队列queue的常见用法
网址:https://blog.csdn.net/weixin_43736974/article/details/87202381
一、queue(队列)简介:
队列也是一种逻辑数据结构,其具有先进先出的特性,只能在队的前端进行删除, 在队的后端进行插入。针对这种特性,可以实现一些较为复杂的逻辑。在实际应用中,部分程序也正需要这样一种顺序进出的数据处理方式。使用这样的逻辑处理方式,使得我们可以将更多精力放在如何处理顺序逻辑之外的事情,对于编程、开发来讲,提供了极大的方便。
同stack类似,queue也可以看成是容器的容器,内部是使用其它容器来存放具体数据。加了一个外壳,使得我们的数据操作只能是在头或尾。从尾部添加数据,从头部取数据,从而实现FIFO的特性。同stack一样,内部默认数据存放容器为deque,若要用非默认容器初始化,必须要在模板中指定容器类型。
定义:
需要定义两个参数 1、元素类型(必须的)。
2、容器类型(不定义默认为deque)
如:queue<int>a;
queue<double>b,c,d;
二、队列函数列表
queue入队,如例:q.push(x); 将x 接到队列的末端。
queue出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问queue队首元素,如例:q.front(),即最早被压入队列的元素。
访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。
判断queue队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
三、成员函数详细说明:
1. push
队列中由于是先进先出,push即在队尾插入一个元素,如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.front()<<endl;
}
可以输出:
2. pop
将队列中最靠前位置的元素拿掉,是没有返回值的void函数。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
q.pop();
cout<<q.front()<<endl;
}
可以输出:
原因是Hello World!已经被除掉了。
3. size
返回队列中元素的个数,返回值类型为unsigned int。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
cout<<q.size()<<endl;
q.push("Hello World!");
q.push("China");
cout<<q.size()<<endl;
}
输出两行,分别为 和 ,即队列中元素的个数。
4. empty
判断队列是否为空的,如果为空则返回true。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
cout<<q.empty()<<endl;
q.push("Hello World!");
q.push("China");
cout<<q.empty()<<endl;
}
输出为两行,分别是 和 。因为一开始队列是空的,后来插入了两个元素。
5. front
返回值为队列中的第一个元素,也就是最早、最先进入队列的元素。注意这里只是返回最早进入的元素,并没有把它剔除出队列。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;
}
输出值为两行,分别是 和 。只有在使用了pop以后,队列中的最早进入元素才会被剔除。
6. back
返回队列中最后一个元素,也就是最晚进去的元素。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.back()<<endl;
}
输出值为 ,因为它是最后进去的。这里back仅仅是返回最后一个元素,也并没有将该元素从队列剔除掉。
其他的方法不是很常用,就不再研究了。
C++ stl队列queue示例代码1:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int e,n,m;
queue<int> q1;
for(int i=0;i<10;i++) q1.push(i);
if(!q1.empty()) cout<<"dui lie bu kong\n";
n=q1.size();
cout<<n<<endl;
m=q1.back();
cout<<m<<endl;
for(int j=0;j<n;j++)
{ e=q1.front();
cout<<e<<" ";
q1.pop();
}
cout<<endl;
if(q1.empty()) cout<<"dui lie kong\n";
n=q1.size(); cout<<"q1.zsize is "<<n<<endl;
system("PAUSE");
return 0;
}
四、应用举例:
1、瓷砖
【问题描述】
在一个 w×h 的矩形广场上,每一块 1×1 的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻的且是黑色的瓷砖上。现在,他想知道,通过重复上述移动所能经过的黑色瓷砖数。
【输入格式】
第 1 行为 h、w,2≤w、h≤50,之间由一个空格隔开。
以下为一个 w 行 h 列的二维字符矩阵,每个字符为“.”“#”“@”,分别表示该位置为黑色的瓷砖、红色的瓷砖,以及小林的初始位置。
【输出格式】
输出一行一个整数,表示小林从初始位置出发可以到达的瓷砖数。
【输入输出样例】
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
【问题分析】
本题是典型的“求连通块”问题,可以采用经典的“宽度优先搜索”算法求解,使用队列维护。
2、关系网络
【问题描述】
有 n 个人,他们的编号为 1~n,其中有一些人相互认识,现在 x 想要认识 y,可以通过他所认识的人来认识更多的人(如果 x 认识 y、y 认识 z,那么 x 可以通过 y 来认识 z),求出 x 最少需要通过多少人才能认识 y。
【输入格式】
第 1 行 3 个整数 n、x、y,n≤100,1≤x、y≤n。
接下来是一个 n×n 的邻接矩阵,a[i,j]=1 表示 i 认识 j,0 表示不认识。
保证 i=j 时,a[i,j]=0,并且 a[i,j]=a[j,i]。行中的每两个数之间用一个空格分开。
【输出格式】
输出一行一个数,表示 x 认识 y 最少需要通过的人数。
【样例输入】
5 1 5
0 1 0 0 0
1 0 1 1 0
0 1 0 1 0
0 1 1 0 1
0 0 0 1 0
【样例输出】
2
【问题分析】
本题是典型的“求最优值”问题,可以通过经典的“宽度优先搜索”算法解决,使用队列维护。
————————————————
版权声明:本文为CSDN博主「流年15096301719」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43736974/article/details/87202381