zoukankan      html  css  js  c++  java
  • queue队列

    Made by Duke.Lv——queue队列

    队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

      当然了,刚才的那是百科上的知识,简单来说就是先进先出的一种数据结构。其实队列可以返回最后一个数据和第一个数据,但只能从第一个数据开始移除。

    头文件#include <queue>

    定义队列queue <int> que;

    使用时有几个函数,如下:

    • q.empty()判断队列q是否为空,当队列q空时,返回true;否则为false(值为0(false)/1(true))。
    • q.size()访问队列q中的元素个数。(不可写成sizeof(q)或size(q))
    • q.push(a)会将一个元素a置入队列q中。
    • q.front()会返回队列q内的第一个元素(也就是第一个被置入的元素)。(不可写成front(q))
    • q.back()会返回队列q中最后一个元素(也就是最后被插入的元素)。(不可写成back(q))
    • q.pop()会从队列q中移除第一个元素。(不可写成pop(q)) 注意:pop()虽然会移除下一个元素,但是并不返回它。front()和back()返回下一个元素但并不移除该元素。

    样例:一个链前的BFS(抄袭自Captain)

    题目描述

    一个有 n 个点, m 条边的有向图,每条边边权都是 1,求 1 号节点到 n 号节点的最短距离。

    代码实现:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    int go[1000001];
    int adj[1000001];
    int nxt[1000001];
    int dis[1000001];
    bool pd[1000001];
    int ecnt=0,m,n;
    queue <int> que;
    void add(int u,int v)
    {
        go[++ecnt]=v;          //边的目的地 
        nxt[ecnt]=adj[u];     //上一条边 
        adj[u]=ecnt;          //点的最后一条边 
    }
    void bfs()
    {
        pd[1]=1;
        que.push(1);         //起点如果不是1可以压入别的数 
        while(!que.empty())
        {
            int u=que.front(),v;
            que.pop();
            for(int e=adj[u];e!=0 ;e=nxt[e])
            {
                if(!pd[v=go[e]])       //如果pd没走过。但是如果有权值,需要进行判断,然后存较小的一个。
                {
                    dis[v]=dis[u]+1;   //最短距离。如果有权值,直接加权值,然后需要比较大小 
                    pd[v]=1;
                    que.push(v);
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(a,b);
        }
        bfs();
        printf("%d
    ",dis[n]);
        return 0;
    } 

    就是这样啦!

    这里又来了一道有趣的题:

    1、编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。

    如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。

    题解:

    #include<iostream>
    #include<queue>
    using namespace std;
    queue <int> x;
    queue <int> y;
    int nx[4] = {0,0,1,-1};
    int ny[4] = {1,-1,0,0};
    bool map[12][12] = {0};
    int num = 0;
    void search(int a,int b)
    {
        x.push(a);
        y.push(b);
        while(x.empty() == 0)
        {
            for(int i = 0;i < 4;i ++)
            {
                if(x.front() + nx[i] <=11&&x.front() + nx[i] >= 0&&y.front() + ny[i] <= 11&&y.front() + ny[i] >= 0&&map[x.front() + nx[i]][y.front() + ny[i]] == 0)
                {
                    x.push(x.front() + nx[i]);
                    y.push(y.front() + ny[i]);
                    map[x.front() + nx[i]][y.front() + ny[i]] = 1;
                }
            }
            x.pop();
            y.pop();
        }
    }
    int main()
    {
        char a[11][11];
        for(int i = 1;i <= 10;i++)
        {
            scanf("%s",a[i]);
            for(int j = 0;j < 10;j++)
            {
                if(a[i][j] == '1')
                map[i][j + 1] = true;
            }
        }
        search(0,0);
        /*for(int i = 0;i <= 11;i++)
        {
            for(int j = 0;j <= 11; j++)
            cout<<map[i][j]<<" ";
            cout<<endl;
        }*/
        for(int i = 0;i < 12;i++)
        {
            for(int j = 0;j < 12;j++)
            {
                if(map[i][j] == 0)
                num++;
            }
        }
        cout<<num;
        return 0;
    }

    /*
    0000000000
    0000111000
    0000100100
    0000010010
    0010001010
    0101010010
    0100110110
    0010000100
    0001111100
    0000000000
    */

    只想找一个不会伤害我的人
  • 相关阅读:
    js数组删除数组元素!
    ASP.NET安全问题--ASP.NET安全架构
    片滚动插件myScroll
    JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari
    poj_2386_dfs
    poj_1852_Ants(复杂问题简单化)
    File Mapping
    Creating a File View
    next_permutation
    Creating a File Mapping Object
  • 原文地址:https://www.cnblogs.com/DukeLv/p/7868657.html
Copyright © 2011-2022 走看看