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

原文链接: https://www.cnblogs.com/shaonianpi/p/12636858.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    STL中队列queue的常见用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/340161

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午12:27
下一篇 2023年3月2日 上午12:27

相关推荐