数据结构猴子吃桃Word文件下载.docx
《数据结构猴子吃桃Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构猴子吃桃Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
约定an端为栈顶,a1端为栈底。
基本操作:
InitStack(&
S)
操作结果:
构造一个空栈S。
DestroyStack(&
初始条件:
栈S已存在。
栈S被销毁。
ClearStack(&
将栈S清为空栈。
StackEmpty(S)
若栈S为空栈,则返回TRUE,否则FALSE。
Push(&
S,&
e)
插入元素e为新的栈顶元素。
Pop(&
栈S已存在且非空。
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
从栈底到栈顶依次对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)主函数
{
intsum;
printf("
数组实现:
"
);
suzhu();
递归实现:
sum=fun
(1);
%d\n"
sum);
栈链实现:
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);
f);
else/*当n不等于10时,进行入栈操作*/
s=Push(s,2,2);
链栈的操作
LinkStackPush(LinkStacks,inta,intb)/*入栈操作*/
Node*p;
p=(LinkStack)malloc(sizeof(Node));
p->
datax=a;
datay=b;
next=s;
s=p;
returns;
LinkStackPop(LinkStacks)/*出栈操作*/
LinkStackp;
if(s==NULL)
{printf("
stackisempty\n"
returnNULL;
p=s;
s=s->
next;
free(p);
5测试分析
测试数据及结果如图5.1:
图5.1
6课程设计总结
通过这次课程设计使我充分的理解了栈的利用并初步学习到了用栈去模拟递归调用,而且对递归调用的细节更加清淅。
虽然此次的程序不是很完备,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。
在刚开始编程的时候,我感到无从下手,但通过学习和查找资料,了解了算法,以这个为基础才开始慢慢写程序,不断改进才最后完成。
在此我非常要感谢的是我的指导老师许又泉老师,感谢老师的细心认真的辅导,让我对数据结构这门课程有了更深一步了解,使我了解到数据结构的重要性,并能运用数据结构去想问题和解决问题。
参考文献
[1]黄同成,黄俊民,董建寅.数据结构[M].北京:
中国电力出版社,2008
[2]董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[4]刘振鹏,张晓莉,郝杰.数据结构[M].北京:
中国铁道出版社,2003
附录(源程序清单)
#include"
stdio.h"
stdlib.h"
#defineN20
{intdatax;
intdatay;
LinkStackPush(LinkStacks,inta,intb)
LinkStackPop(LinkStacks)
/*栈链实现*/
voidZhanlian(intn)
intf;
LinkStacks=NULL;
/*数组实现*/
voidsuzhu()
inti,a[N];
a[10]=1;
a[1]);
/*递归实现*/
/*主函数*/