猴子选大王 课程设计报告.docxVIP

  • 0
  • 0
  • 约5.73千字
  • 约 15页
  • 2024-01-24 发布于江苏
  • 举报

PAGE14

实用文档

目录

TOC\o1-3\h\z\u一、需求分析 2

1、问题描述: 2

2、基本要求: 2

3、需求分析: 2

二、概要设计 3

三、详细设计 4

1、循环队列 4

2、循环链表 5

3、伪代码 6

4、具体函数分析及变量分析 7

四、调试分析和测试结果 7

五、总结 10

六、参考文献 11

七、附录 12

一、需求分析

1、问题描述:

一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

2、基本要求:

输入数据:输入m,n。m,n为整数,nm。

输出形式:中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。

3、需求分析:

①输入数据m,n

②计算出最终猴子大王的序号。

③模拟出整个过程。

④找到合适的数据结构处理这个问题。

⑤找到正确的方法解决这个问题。

二、概要设计

对题意进行分析后,可以画出整个过程的流程图。

具体流程图:

这个问题属于约瑟夫环问题,我们对这个题目进行具体分析:

假如现在m=5,n=2,即有5只猴子,按照循环数2的方法,我们演变这个过程:

第一次:12345

×2号出局

第二次:12345

××4号出局

第三次:12345

×××1号出局

第四次:12345

××××5号出局

最后得到猴子大王的序号是3号。

那么一般化,对于m猴子,n只猴子我们该怎么做?

三、详细设计

1、循环队列

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

仔细分析整个过程,我发现这个过程和学过的循环队列特别像,在学习循环队列的时候,如果采取数组来存储队列,那么在front端弹出元素就执行front=(front+1)%MAX,在rear端进入队列的时候就执行rear=(rear+1)%MAX,以实现绕圈的操作。

回顾一下循环队列的具体的入队算法:

1、tail=tail+1;

2、若tail=n+1,则tail=1;

3、若head=tail尾指针与头指针重合了,表示元素已装满队列,则作上溢出错处理;

4、否则,Q(tail)=X,结束(X为新入出元素)。

队列空的条件:front==rear

队列满的条件:(rear+1)%=MAXSIZE==front

那么在这个问题中能不能学习这个技巧?仔细想想,我认为答案是可以的。

在问题中还牵涉到一个淘汰的过程,对于这个问题,我们该怎么处理?其实这个问题比较好处理,如果我们采取的是链表那么直接删除掉就可以了,如果是数组,我们只要把删除的做个标记,下次碰到已经删除的直接跳过这个元素就可以了。

2、循环链表

在这个问题上也可以用链表。

链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据和一或两个用来指向明上一个/或下一个节点的位置的地址。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

显然这个问题可以用循环链表处理。

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个

文档评论(0)

1亿VIP精品文档

相关文档