zoukankan      html  css  js  c++  java
  • STL函数库的应用第一弹——数据结构(队列)

    队列是什么?

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

    和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

    ——来自百度百科

    队列,简单来说,就是数据排队(废话)。

    打个比方,在超市买东西,假设我们是收银员,顾客在排队,每个人来了之后都要排在队尾,而离开的人总是排在队首的人,

    这就是一个队列,每个顾客都是一个元素,每个元素都在队列的最后进入,从队列头出去。

    队列有什么作用?

    我可以十分不负责任的说,队列这个东西本身没什么卵用(我自己感觉),但是!!!

    队列和一些重要的算法息息相关,比如广搜,而广搜又和图论和二叉树扯上关系,所以队列十分重要。

    (这里BB两句广搜)

    广搜算法的大概实现方法是,从一个点出发,把从这个点出发的所有可能算出,让他们进入队列,然后一个个出队列,算可能,存结果……

    广搜对于寻找最短路相对于深搜具有巨大的优势,因为广搜一旦搜索出了最短路,立刻就会停止搜索,这样节省了大量时间。而深搜需要把整个图都搜完,才能给出结果。

    广搜我之后也会写博客(前提是我能学会)

    队列代码怎么写?

    在c++一本通里,编者的代码都是手写队列,用数组和指针。当然我也推荐这么写(因为运行快),但是!!!这样写非常的费时间!

    那么今天的重头戏来了,既然c++给我们提供了专用队列函数,为什么不用呢?

    queue!

    queue是一个c++给我们提供的队列,并且配套了一整套函数,用起来非常的香!!!

    #include<queue>

    声明格式

    queue<int>q;(<>中间是任何你想要的数据类型,最后是你的队列名)

    这个头文件里,主要有以下函数

    q.push() 将一个元素入队

    q.pop() 将一个元素弹出队列(你可以认为是删除)

    q.front() 访问队列头

    q.back() 访问队列尾

    q.empty() 如果队列为空,返回true

    q.size() 返回队列的元素个数

    例题!!!

    由于纯纯的队列题,一本通题库里几乎没有,所以简单的上两个题,就水完这篇博客了(逃

    ybt1332

    【题目描述】

    假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。

    规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

    【输入】

    第一行两队的人数;

    第二行舞曲的数目。

    【输出】

    配对情况。

    经典的队列题!

    我们假设男、女都是一个队列,先让他们站好队,然后每次输出队首的元素,再把这个队首的元素入队,最后把队首元素弹出就OK了!

    上代码!

    #include<iostream>
    #include<queue>
    using namespace std;
    int main()
    {
        queue<int>q;//声明队列
        queue<int>p;
        int man,wom,n;
        cin>>man>>wom>>n;
        for (int i=1;i<=man;i++)
        {
            q.push(i);//男士入队
        }
        for (int i=1;i<=wom;i++)
        {
            p.push(i);//女士入队
        }
        for (int i=1;i<=n;i++)
        {
            cout<<q.front()<<" "<<p.front()<<endl;//访问队首元素并输出,即为配对成功
            q.push(q.front());//把队首元素入队
            p.push(p.front());
            q.pop();//弹出队首元素
            p.pop();
        }
        return 0;
    }

    怎么样,是不是很简单???

    那么我们看白皮书上给的代码!

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int a[10001],b[10001],k1=1,k,i,f1=1,r1,f2=1,r2;//k1是计数器 
    int main()
    {
        int m,n;
        cin>>m>>n;
        for (i=1;i<=m;i++)
        {
            a[i]=i;//入队 
        }
        for (i=1;i<=n;i++)
        {
            b[i]=i;    
        }
        cin>>k;
        r1=m;//r1/r2负责在队尾插入元素 
        r2=n;
        while(k1<=k)
        {
            printf("%d %d
    ",a[f1],b[f2]);
            r1++;a[r1]=a[f1];f1++;//f1/f2是指针,指向第k1轮输出的元素 
            //第一次a[m+1]=a[1]=1,第二次a[m+2]=a[2]=2,如此循环 
            r2++;b[r2]=b[f2];f2++;
            //第一次b[n+1]=b[1]=1,第二次b[m+2]=b[2]=2,如此循环
            k1++; 
        }
        return 0;
    }

    相比之下,手写队列的变量显然较多(因为要有指针,入队操作)

    我们用queue函数库里的函数就可以让我们的代码变得清爽啦!!!

    是不是很香呢???

    像我一样的新手赶紧用起来吧!!!(逃)

    最后,水一下博文长度,上一个疑似队列的题(个人感觉)

    ybt 1334

    题目描述】

    n个人依次围成一圈,从第1个人开始报数,数到第mmm个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,

    如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,3,4,5……12

    请你打印出列的顺序。

    【输入】

    n

    n和mm

    【输出】

    出列的顺序。

    上代码

    //1334第二队列
    #include<iostream>
    using namespace std;
    int duilie[110];
    int main()
    {
        int n,num,kkk=1,zhizhen=1;
        cin>>n>>num;
        for (int i=1;i<=n;i++)
        {
            duilie[i]=i;
        }
        if (num==1)
        {
            for (int i=1;i<=n;i++)
            {
                cout<<duilie[i]<<" ";    
            }
            return 0;
        }
        while (1)
        {
            kkk++;
            zhizhen++;
            if (zhizhen==n+1)
            {
                zhizhen=1;
            }
            if (kkk==num)
            {
                cout<<duilie[zhizhen]<<" ";
                for (int j=zhizhen;j<n;j++)
                {
                    duilie[j]=duilie[j+1];
                }
                if (zhizhen==n)
                {
                    zhizhen=1;
                }
                kkk=1;
                n--;
            }
            if(n==0)
            {
                break;
            }
        }
        return 0;
    }  

    注解,,,额,实在是困了,懒得写了,相信各位大佬都能看懂吧……(逃)

    12点了,晚安,睡觉去了。

  • 相关阅读:
    express开发实例
    node.js操作mongoDB数据库
    Mysql JDBC Url参数说明useUnicode=true&characterEncoding=UTF-8
    Hibernate 使用说明
    mysql 时间戳与日期格式的相互转换
    MOOC即Massive Open Online Course的缩写
    CentOS+Apache+php无法访问redis的解决方法
    CentOS 6.5下Redis安装详细步骤
    Linux进程基础
    CentOS如何查看端口是被哪个应用/进程占用
  • 原文地址:https://www.cnblogs.com/zaza-zt/p/12528427.html
Copyright © 2011-2022 走看看