zoukankan      html  css  js  c++  java
  • 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=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=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

  • 相关阅读:
    Linux日志管理系统rsyslog
    Linux访问权限控制及时间同步实践
    Linux系统自动化安装之cobbler实现
    【转】java取整和java四舍五入方法
    The web application [ ] registered the JDBC driver [net.sourceforge.jtds.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver
    Python学习笔记之函数式编程
    Java去重字符串的两种方法以及java中冒号的使用
    Python学习之字符串格式化
    Python学习之文件操作
    Python学习笔记之爬虫
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12636858.html
Copyright © 2011-2022 走看看