数据结构猴子吃桃.docx
- 文档编号:3551346
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:9
- 大小:32.45KB
数据结构猴子吃桃.docx
《数据结构猴子吃桃.docx》由会员分享,可在线阅读,更多相关《数据结构猴子吃桃.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构猴子吃桃
1问题描述
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子,求原来这群猴子共摘了多少个桃子。
一种采用数组数据结构实现;一种采用栈链数据结构实现; 一种采用递归实现上述求解。
2需求分析
(1)由问题可知,题目中知道第十天所剩的桃子数,所以可以及往前算,算出前一天所剩余的桃子数,到第一天时即为总的桃子数,所以可用数组来存每天所剩的桃子数,容易实现求解。
(2)根据问题设第n天的桃子数为f(n),则前一天的桃子数为f(n+1)=f(n)-(f(n)/2+1),化解可得f(n)=2f(n+1)+2,以此为依据实现递归。
(3)由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。
即可通过用栈的链表储存结构模拟函数的递归调用过程来实现问题的求解。
3概要设计
3.1抽象数据类型定义
栈的抽象数据类型定义
ASTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={
约定an端为栈顶,a1端为栈底。
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
DestroyStack(&S)
初始条件:
栈S已存在。
操作结果:
栈S被销毁。
ClearStack(&S)
初始条件:
栈S已存在。
操作结果:
将栈S清为空栈。
StackEmpty(S)
初始条件:
栈S已存在。
操作结果:
若栈S为空栈,则返回TRUE,否则FALSE。
Push(&S,&e)
初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已存在且非空。
操作结果:
从栈底到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败,则操作失败。
}ADTStack
3.2模块划分
本程序包括四个模块:
(1)主程序模块
voidmain()
{
初始化;
数组求解;
递归求解;
栈链求解;
}
(2)栈模块——实现栈的抽象数据类型
(3)数组模块——实现数组的运用
(4)递归模块——实现递归的运用
4详细设计
4.1数据类型的定义
(1)数组类型
#defineN
inta[N];
(2)栈类型
typedefstructnode
{intdatax;
intdatay;
structnode*next;
}Node,*LinkStack;
4.2主要模块的算法描述
(1)主函数
voidmain()
{
intsum;
printf("数组实现:
");
suzhu();
printf("递归实现:
");
sum=fun
(1);
printf("%d\n",sum);
printf("栈链实现:
");
Zhanlian
(1);
}
(2)利用数组实现求解
inta[N]用以存每天所下的桃子数,从第10天a[10]=1向前循环,到第一天,即为总的个数。
for(i=9;i>=1;i--)
a[i]=2*a[i+1]+2;
(3)利用递归实现求解
根据题可得出f(n)=2f(n+1)+2,由此可用递归调有函数。
intfun(intn)
{
if(n==10)
return1;
else
return(2*fun(n+1)+2);
}
(4)用链栈实现求解
由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。
递归调用中每层递归要把参数用栈来保存,每进入一层递归,就压入栈顶,每退出一层,则出栈。
因为f(n)=2f(n+1)+2,即应把参数2,2存入模拟栈中,当出栈时进行运算,并用中间变量f存结果。
for(n=1;n<=10;n++)
{
if(n==10)/*当n=10,给f赋值第十天的桃子数;并开始进行出栈操作*/
{f=1;
while(s)
{
f=s->datax*f+s->datay;
s=Pop(s);
}
printf("%d\n",f);
}
else/*当n不等于10时,进行入栈操作*/
s=Push(s,2,2);
}
链栈的操作
LinkStackPush(LinkStacks,inta,intb)/*入栈操作*/
{
Node*p;
p=(LinkStack)malloc(sizeof(Node));
p->datax=a;p->datay=b;
p->next=s;
s=p;
returns;
}
LinkStackPop(LinkStacks)/*出栈操作*/
{
LinkStackp;
if(s==NULL)
{printf("stackisempty\n");returnNULL;}
p=s;
s=s->next;
free(p);
returns;
}
5测试分析
测试数据及结果如图5.1:
图5.1
6课程设计总结
通过这次课程设计使我充分的理解了栈的利用并初步学习到了用栈去模拟递归调用,而且对递归调用的细节更加清淅。
虽然此次的程序不是很完备,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。
在刚开始编程的时候,我感到无从下手,但通过学习和查找资料,了解了算法,以这个为基础才开始慢慢写程序,不断改进才最后完成。
在此我非常要感谢的是我的指导老师许又泉老师,感谢老师的细心认真的辅导,让我对数据结构这门课程有了更深一步了解,使我了解到数据结构的重要性,并能运用数据结构去想问题和解决问题。
参考文献
[1]黄同成,黄俊民,董建寅.数据结构[M].北京:
中国电力出版社,2008
[2]董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:
中国电力出版社,2008
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[4]刘振鹏,张晓莉,郝杰.数据结构[M].北京:
中国铁道出版社,2003
附录(源程序清单)
#include"stdio.h"
#include"stdlib.h"
#defineN20
typedefstructnode
{intdatax;
intdatay;
structnode*next;
}Node,*LinkStack;
LinkStackPush(LinkStacks,inta,intb)
{
Node*p;
p=(LinkStack)malloc(sizeof(Node));
p->datax=a;p->datay=b;
p->next=s;
s=p;
returns;
}
LinkStackPop(LinkStacks)
{
LinkStackp;
if(s==NULL)
{printf("stackisempty\n");returnNULL;}
p=s;
s=s->next;
free(p);
returns;
}
/*栈链实现*/
voidZhanlian(intn)
{
intf;
LinkStacks=NULL;
for(n=1;n<=10;n++)
{
if(n==10)
{f=1;
while(s)
{
f=s->datax*f+s->datay;
s=Pop(s);
}
printf("%d\n",f);
}
else
s=Push(s,2,2);
}
}
/*数组实现*/
voidsuzhu()
{
inti,a[N];
a[10]=1;
for(i=9;i>=1;i--)
a[i]=2*a[i+1]+2;
printf("%d\n",a[1]);
}
/*递归实现*/
intfun(intn)
{
if(n==10)
return1;
else
return(2*fun(n+1)+2);
}
/*主函数*/
voidmain()
{
intsum;
printf("数组实现:
");
suzhu();
printf("递归实现:
");
sum=fun
(1);
printf("%d\n",sum);
printf("栈链实现:
");
Zhanlian
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 猴子