lisson小废废


私信TA

用户名:13751858898

访问量:224

签 名:

等  级
排  名 14587
经  验 874
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 中山大学
专  业

  自我简介:

TA的其他文章

解题思路:

先对照代码过一遍思路:


首先定义一个数组队列:

第一步,定义一个数组,大小尽量大(后面会解释),初始化为0(习惯)。

第二步,给前n个元素编号为1,2,3……相当于给n个玩家编号。

第三步,定义两个指针front和rear,front=0表示front指向队首,rear=n-1表示rear指向队尾。


此时数组队列已定义完毕。

那我们要怎么模拟数到3的人退出队列呢?

很简单,只要在遍历队列时每遍历两个就跳过一个即可。

那我们怎样保留数1和数2的玩家呢?

也很简单,比如front=0的人编号为1,我们把他放到队尾,同时记得移动队尾和队首,即a[++rear]=a[front++];

最后执行循环到队列只剩下一个元素就能得出答案了。


注意事项:


使用顺序队列要求数组大小足够大,如果想占用尽可能小的空间实现队列功能可以构造循环队列,即rear指向数组的最后一个内存空间时,rear-=len-1;

参考代码:


#include<stdio.h> 

int main(){

    int a[1000];            //尽量大

    int front,rear,n;

    scanf("%d",&n);

    rear=n-1;front=0;

    int i=0;

    for(i=0;i<n;i++)

          a[i]=i+1;            //定义队列 

    while(rear>front){

        a[++rear]=a[front++];

        a[++rear]=a[front++];

        front++;

    }                              //循环结束时rear=front,表示该队列此时只有一个元素 

    printf("%d",a[rear]);

}


 

0.0分

2 人评分

  评论区

  • «
  • »