1.队列的定义
队列就是允许在一端进行插入,在另一端进行删除的线性表。允许插入的一端称为队尾,通常用一个队尾指针r指向队尾元素,即r总是指向最后被插入的元素;允许删除的一端称为队首,通常也用一个队首指针f指向排头元素的前面。初始时f=r=0。
2.与栈的区别:栈:先入后出;
队列:先入先出;
3队列的基本操作:
(1)初始化队列 queuevis ,定义一个队列
(2)入队 vis.push(x)
(3)出队 vis.pop()
(4)判断队列是否为空 vis.empty()
(5)判断队列中元素的数量vis.size()
(6)得到队列的队首元素 vis.front()
综上: #include
用<bits/stdc++.h>则无需考虑头文件。
题目:
problem A:周末舞会-队列
nefu 1632
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
queue<int>vis1,vis2;
int main()
{
int n,m,k,i;
scanf("%d%d%d",&m,&n,&k);
for(i=1;i<=m;i++)
vis1.push(i);
for(i=1;i<=n;i++)
vis2.push(i);
for(i=1;i<=k;i++)
{
int t1=vis1.front();vis1.pop();
int t2=vis2.front();vis2.pop();
printf("%d %d\n",t1,t2);
vis1.push(t1);
vis2.push(t2);
}
return 0;
}
problem B:报数-队列-约瑟夫环
nefu 1634
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
queue<int>vis;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
vis.push(i);
int num=0;
while(vis.size()>1)
{
num++;
int tmp=vis.front();
vis.pop();
if(num%m!=0)vis.push(tmp);
}
printf("%d",vis.front());
return 0;
}
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a,t,num,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
queue<int>vis;
for(i=1;i<=n;i++)
vis.push(i);
num=0;
while(!vis.empty())
{
num++;
if(num%m==0)
{
for(j=1;j<m;j++)
{
t=vis.front();
vis.pop();
vis.push(t);
}
vis.pop();
}
if(vis.size()==1)
break;
}
a=vis.front();
printf("%d\n",a);
}
return 0;
}
problem C:酒桌游戏-队列
nefu 1635
#include <iostream>
#include<bits/stdc++.h>
struct stu{
int num;
char name[20];
}p[5000];
using namespace std;
queue<stu>vis;
bool judge(int a)
{
if(a%7==0) return 1;
while(a)
{if(a%10==7)return 1;
a=a/10;
}
return 0;
}
int main()
{
int n,m,t;
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
{
scanf("%s",p[i].name);
p[i].num=i;
vis.push(p[i]);/*结构体入队列的方法*/
}
for(int i=1;i<m;i++)
{
stu tm=vis.front();
vis.pop();
vis.push(tm);
}
t--;/*要判断第一个数,是否符合条件*/
while(vis.size()>1)
{
t++;/*加一个数把队列的一个数做判断是否放到后面*/
stu tmp=vis.front();
vis.pop();
if(!judge(t))vis.push(tmp);
}
printf("%s",vis.front().name);
return 0;
}
problem D:取牌游戏-队列-SET
nefu 1633
#include <iostream>
#include<bits/stdc++.h>
const int N=1e5;
int a[N];
using namespace std;
queue<int>vis;
int main()
{
int n,k,p;
scanf("%d%d%d",&n,&k,&p);
for(int i=1;i<=k;i++)
vis.push(i);
int num=0;int j=0;
while(!vis.empty())
{
int t=vis.front();
vis.pop();
num++;
if(num%n==0)
a[j++]=t;
for(int i=1;i<=p;i++)
{
int tmp=vis.front();
vis.pop();
vis.push(tmp);
}
}
sort(a,a+k/n);
for(int i=0;i<k/n;i++)
printf("%d\n",a[i]);
return 0;
}
problem E:海港-队列
nefu 1636
#include <iostream>
#include<bits/stdc++.h>
struct stu{
int t;
int x;
};/*以乘客为单位的结构体*/
int num[100001];
using namespace std;
queue<stu>vis;
int main()
{
int n,k,t,x;
struct stu tmp;
scanf("%d",&n);
int ans=0;
while(n--)
{
scanf("%d%d",&t,&k);
for(int i=0;i<k;i++)
{
scanf("%d",&x);
vis.push({t,x});/*省略了结构体赋值的过程,并且把每一位乘客的信息压入队列*/
if(num[x]==0)ans++;
num[x]++;
}
while(t-vis.front().t>=86400)/*用新来船只的时间和队列头部的时间作比较*/
{
tmp=vis.front();
vis.pop();
int x1=tmp.x;
num[x1]--;/*注意计算国家数是否变化*/
if (num[x1]==0) ans--;
}
printf("%d\n",ans);/*注意在此处输出国家数*/
}
return 0;
}
problem F:Blash数集-队列-set
nefu 1662
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p2,p3,a[100000];
scanf("%d%d",&a[1],&n);
p2=p3=1;
for(int i=2;i<=n;i++)/*丑数思想*/
{
a[i]=min(2*a[p2]+1,3*a[p3]+1);
if(a[i]==2*a[p2]+1)p2++;
if(a[i]==3*a[p3]+1)p3++;
}
printf("%d",a[n]);
return 0;
}
problem G:关系网络-队列
nefu 1663
#include <bits/stdc++.h>
using namespace std;
struct stu{
int x;
int ans;};/*x记录编号,ans的记录从x1到x的步数*/
queue<stu>vis;
int p[100],a[100][100];
int main()
{
int n,x1,y1;
cin>>n>>x1>>y1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
vis.push({x1,0});/*把起点入伍,且ans=0*/
p[x1]=1;/*入伍标记*/
while(!vis.empty())/*找答案*/
{
int x=vis.front().x;
int ans=vis.front().ans;
vis.pop();/*记录并输出队伍头方便找下一个编号*/
if(x==y1)
{
printf("%d\n",ans-1);break;
}
for(int i=1;i<=n;i++)
{
if(a[x][i]&&!p[i])/*a[x][i]不等于0,并且p[i]为0*/
{
p[i]=1;/*找从x1到再到i逐渐到y1*/
vis.push({i,ans+1});/*自始至终队伍中只有一个元素*/
}
}
}
return 0;
}