STL详解(三) 队列容器queue

本文深入解析C++ STL中的队列(queue)数据结构,介绍其基本概念、成员函数及其应用场景,包括典型问题如求连通块、关系网络等,适合初学者及进阶者学习。

一、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

【问题分析】

本题是典型的“求最优值”问题,可以通过经典的“宽度优先搜索”算法解决,使用队列维护。

3、P1996 约瑟夫问题

4、P1540 [NOIP2010 提高组] 机器翻译

5、P2058 [NOIP2016 普及组] 海港P2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值