数据结构(二)——队列

来源:互联网 发布:淘宝查销售额 编辑:程序博客网 时间:2024/06/05 16:49

一、队列定义:队列是限定在一端进行插入,另一端进行删除特殊线性表。


二、队列基本操作:

  1. 入队
  2. 出队

三、队列例题:
1.例1:舞伴配对问题:
分析:这一题是一道经典的取模运算,每一次将编号往前加一位,到达n就取模。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int main(){    int i,j,k,n,m;    scanf("%d%d%d",&m,&n,&k);    int a=1,b=1;    while(k>0){        printf("%d %d\n",a,b);        a%=m;b%=n;a++;b++;        k--;     }    return 0;}

2.集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
(1)数1属于M;
(2)如果X属于M,则Y=2*x+1和Z=3*x+1也属于M;
(3)此外再没有别的数属于M。
分析:这一题可以用两个数组来存放有Y和Z产生而出的元素,再通过对比选出小的输出:

#include<stdio.h>int a[100001],b[100001];int main(){    int i,j,k,n,m;    int x=1;    int ra=0,rb=0,la=1,lb=1;    scanf("%d",&n);    while(n>0){        printf("%d\n",x);        a[++ra]=x*2+1;b[++rb]=x*3+1;        if(a[la]>b[lb])x=b[lb++];        else if(a[la]<b[lb])x=a[la++];        else{            x=a[la++];lb++;        }        n--;    }    return 0;}

3.约瑟夫问题(小型数据):
分析:这一题可以使用链式存储结构,当你删除一个位置时,把后继为它的后继改为删除位置的后继即可:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int a[100001];int main(){    int i,j,k,n,m;     scanf("%d%d",&n,&m);    for(i=1;i<n;i++)a[i]=i+1;    a[n]=1;j=1;    while(n>0){        n--;        int js=1;        while(js<m){            js++;j=a[j];        }        printf("%d\n",a[j]);        a[j]=a[a[j]];    }    return 0;}

4.细胞个数问题:
分析:其实这一题与队列并没有什么太大的关系,出题人可能是想通过广搜的方式来解决,但完全不要用广搜!

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>char s[1001][1001];int a[1001][1001];int main(){    int i,j,k,n,m,ans=0;    scanf("%d%d\n",&n,&m);    for(i=1;i<=n;i++){        for(j=1;j<=m;j++){            scanf("%c",&s[i][j]);            a[i][j]=s[i][j]-'0';        }        if(i!=n)scanf("\n");     }    for(i=1;i<=n;i++)        for(j=1;j<=m;j++)            if(a[i][j] && !a[i-1][j] && !a[i][j-1])ans++;    printf("%d\n",ans);    return 0;}/*4 100234500067103456050020456006710000000089*/ 

5.最少步数
分析:这一题才是真正的广搜,我们通过建立状态来新建数据节点,马有8种方式,象有4种方式,所以这就是一道模版题目啊!

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int a[100001],c[100001];int b[101][101];int ans[100001];int wa1[9]={0,-2,-1,1,2,-2,-1,1,2};int lk1[9]={0,-1,-2,-2,-1,1,2,2,1};int wa2[5]={0,-2,2,-2,2};int lk2[5]={0,-2,-2,2,2};void bfs(int x,int y){    int head=0,tail=1;    int i,j,k;    a[tail]=x;c[tail]=y;ans[tail]=0;    b[x][y]=1;    while(head<tail){        head++;        for(k=1;k<=8;k++){            int ts=a[head]+wa1[k],ts1=c[head]+lk1[k];            if(b[ts][ts1])continue;            b[ts][ts1]=1;            a[++tail]=ts;c[tail]=ts1;ans[tail]=ans[head]+1;            if(ts==1 && ts1==1){                printf("%d\n",ans[tail]);return;            }        }        for(k=1;k<=4;k++){            int ts=a[head]+wa2[k],ts1=c[head]+lk1[k];            if(b[ts][ts1])continue;            b[ts][ts1]=1;            a[++tail]=ts;c[tail]=ts1;ans[tail]=ans[head]+1;            if(ts==1 && ts1==1){                printf("%d\n",ans[tail]);return;            }        }     } } int main(){    int i,j,k,n,m,x,y;    scanf("%d%d%d%d",&n,&m,&x,&y);    bfs(n,m);    memset(b,0,sizeof(b));    bfs(x,y);    return 0;}