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
*/

只想找一个不会伤害我的人
原文地址:https://www.cnblogs.com/DukeLv/p/7868657.html