1、数据结构猴子吃桃1 问题描述有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子,求原来这群猴子共摘了多少个桃子。一种采用数组数据结构实现;一种采用栈链数据结构实现;一种采用递归实现上述求解。2 需求分析(1)由问题可知,题目中知道第十天所剩的桃子数,所以可以及往前算,算出前一天所剩余的桃子数,到第一天时即为总的桃子数,所以可用数组来存每天所剩的桃子数,容易实现求解。(2)根据问题设第n天的桃子数为f(n),则前一天的桃子数为f(n+1)=f(n)-(f(n)/2+1),化解可得f(n)=2f(n+1)+2,以此为依据实现递归。 (3) 由栈与递归的实现
2、可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。即可通过用栈的链表储存结构模拟函数的递归调用过程来实现问题的求解。3 概要设计31抽象数据类型定义栈的抽象数据类型定义AST Stack数据对象:D=ai|aiElemSet,i=1,2,.,n, n0数据关系:R1=|ai-1,aiD,i=2,.,n约定an端为栈顶,a1端为栈底。基本操作:InitStack(&S)操作结果:构造一个空栈S。DestroyStack(&S)初始条件:栈S已存在。操作结果:栈S被销毁。ClearStack(&S)初始条件:栈S已存在。操作结果:将栈S清为空栈。StackEm
3、pty(S)初始条件:栈S已存在。操作结果:若栈S为空栈,则返回TRUE,否则FALSE。Push(&S,&e)初始条件:栈S已存在。操作结果:插入元素e为新的栈顶元素。Pop(&S,&e)初始条件:栈S已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。StackTraverse(S,visit()初始条件:栈S已存在且非空。操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败,则操作失败。ADT Stack32模块划分本程序包括四个模块:( 1 ) 主程序模块void main()初始化;数组求解;递归求解;栈链求解;( 2 ) 栈模块实现栈的抽
4、象数据类型( 3 ) 数组模块实现数组的运用( 4 ) 递归模块实现递归的运用4 详细设计41数据类型的定义(1)数组类型#define N int aN;(2)栈类型typedef struct node int datax; int datay; struct node *next;Node,*LinkStack;42主要模块的算法描述( 1 )主函数void main() int sum;printf(数组实现:);suzhu();printf(递归实现:);sum=fun(1);printf(%dn,sum);printf(栈链实现:);Zhanlian(1); ( 2 )利用数组实现
5、求解int aN 用以存每天所下的桃子数,从第10天a10=1向前循环,到第一天,即为总的个数。for(i=9;i=1;i-)ai=2*ai+1+2;( 3 )利用递归实现求解根据题可得出f(n)=2f(n+1)+2,由此可用递归调有函数。int fun(int n)if(n=10)return 1;elsereturn(2*fun(n+1)+2);( 4 )用链栈实现求解由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。递归调用中每层递归要把参数用栈来保存,每进入一层递归,就压入栈顶,每退出一层,则出栈。因为f(n)=2f(n+1)+2,
6、即应把参数2,2存入模拟栈中,当出栈时进行运算,并用中间变量f存结果。for(n=1;ndatax*f+s-datay;s=Pop(s);printf(%dn,f);else /*当n不等于10时,进行入栈操作*/s=Push(s,2,2);链栈的操作LinkStack Push(LinkStack s,int a, int b)/*入栈操作*/Node *p;p=(LinkStack)malloc(sizeof(Node);p-datax=a;p-datay=b;p-next=s;s=p;return s;LinkStack Pop(LinkStack s)/*出栈操作*/ LinkStac
7、k p;if(s=NULL)printf(stack is emptyn);return NULL;p=s;s=s-next;free(p);return s;5 测试分析测试数据及结果如图 51: 图 516 课程设计总结通过这次课程设计使我充分的理解了栈的利用并初步学习到了用栈去模拟递归调用,而且对递归调用的细节更加清淅。虽然此次的程序不是很完备,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。在刚开始编程的时候,我感到无从下手,但通过学习和查找资料,了解了算法,以这个为基础才开始慢慢写程序,不断改进才最后完成。在此我非常要感谢的是我的指导老师许又泉老
8、师,感谢老师的细心认真的辅导,让我对数据结构这门课程有了更深一步了解,使我了解到数据结构的重要性,并能运用数据结构去想问题和解决问题。参考文献1 黄同成,黄俊民,董建寅数据结构M北京:中国电力出版社,20082 董建寅,黄俊民,黄同成数据结构实验指导与题解M北京:中国电力出版社,20083 严蔚敏,吴伟民. 数据结构(C语言版)M. 北京:清华大学出版社,20024 刘振鹏,张晓莉,郝杰数据结构M北京:中国铁道出版社,2003附录(源程序清单)#includestdio.h#includestdlib.h#define N 20typedef struct node int datax; in
9、t datay; struct node *next;Node,*LinkStack;LinkStack Push(LinkStack s,int a, int b)Node *p;p=(LinkStack)malloc(sizeof(Node);p-datax=a;p-datay=b;p-next=s;s=p;return s;LinkStack Pop(LinkStack s) LinkStack p;if(s=NULL)printf(stack is emptyn);return NULL;p=s;s=s-next;free(p);return s;/*栈链实现*/void Zhanli
10、an(int n)int f;LinkStack s=NULL;for(n=1;ndatax*f+s-datay;s=Pop(s);printf(%dn,f);elses=Push(s,2,2);/*数组实现*/void suzhu()int i,aN;a10=1;for(i=9;i=1;i-)ai=2*ai+1+2;printf(%dn,a1);/*递归实现*/int fun(int n)if(n=10)return 1;elsereturn(2*fun(n+1)+2);/*主函数*/void main()int sum;printf(数组实现:);suzhu();printf(递归实现:);sum=fun(1);printf(%dn,sum);printf(栈链实现:);Zhanlian(1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1