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\n",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
*/
只想找一个不会伤害我的人