队列的基本原理

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值