1、数据结构实验报告移动盘片问题实验题目移动盘片问题小组合作无姓名班级学 号一、实验目的递归到非递归的转换二实验环境VC+6.0三、实验内容与步骤1. 使用递归算法解Hanoi问题/-递归算法-void Hanoi1(int n,char a,char b,char c) if (n=1) printf(t将第%d个盘片从%c移动到%cn,n,a,c); else Hanoi1(n-1,a,c,b); printf(t将第%d个盘片从%c移动到%cn,n,a,c); Hanoi1(n-1,b,a,c); 2. 转换为等价的非递归算法/-非递归算法-typedef struct int n; /盘片
2、个数 char x,y,z; /3个塔座 bool flag; /可直接移动盘片时为true,否则为false ElemType; /顺序栈中元素类型typedef struct ElemType dataMaxSize; /存放元素 int top; /栈顶指针 StackType; /声明顺序栈类型3. 编写求解Hanoi问题对应顺序栈的基本运算算法void InitStack(StackType *&s) /初始化栈 s=(StackType *)malloc(sizeof(StackType); s-top=-1;void DestroyStack(StackType *&s) /销毁
3、栈 free(s);bool StackEmpty(StackType *s) /判断栈是否为空 return(s-top=-1);bool Push(StackType *&s,ElemType e) /进栈 if (s-top=MaxSize-1) return false; s-top+; s-datas-top=e; return true;bool Pop(StackType *&s,ElemType &e) /出栈 if (s-top=-1) return false; e=s-datas-top; s-top-; return true;void Hanoi2(int n, ch
4、ar x, char y, char z) StackType *st; /定义顺序栈指针 ElemType e,e1,e2,e3; if (n=0) return; /参数错误时直接返回 InitStack(st); /初始化栈 e.n=n; e.x=x; e.y=y; e.z=z; e.flag=false; Push(st,e); /元素e进栈 while (!StackEmpty(st) /栈不空循环 Pop(st,e); /出栈元素e if (e.flag=false) /当不能直接移动盘片时 e1.n=e.n-1; e1.x=e.y; e1.y=e.x; e1.z=e.z; if
5、(e1.n=1) /只有一个盘片时可直接移动 e1.flag=true; else /有一个以上盘片时不能直接移动 e1.flag=false; Push(st,e1); /处理Hanoi(n-1,y,x,z)步骤 e2.n=e.n; e2.x=e.x; e2.y=e.y; e2.z=e.z; e2.flag=true; Push(st,e2); /处理move(n,x,z)步骤 e3.n=e.n-1; e3.x=e.x; e3.y=e.z; e3.z=e.y; if (e3.n=1) /只有一个盘片时可直接移动 e3.flag=true; else e3.flag=false; /有一个以上
6、盘片时不能直接移动 Push(st,e3); /处理Hanoi(n-1,x,z,y)步骤 else /当可以直接移动时 printf(t将第%d个盘片从%c移动到%cn,e.n,e.x,e.z); DestroyStack(st); /销毁栈四、实验过程与分析实验程序#include #include #define MaxSize 100void Hanoi1(int n,char a,char b,char c) if (n=1) printf(t将第%d个盘片从%c移动到%cn,n,a,c); else Hanoi1(n-1,a,c,b); printf(t将第%d个盘片从%c移动到%c
7、n,n,a,c); Hanoi1(n-1,b,a,c); typedef struct int n; /盘片个数 char x,y,z; /3个塔座 bool flag; /可直接移动盘片时为true,否则为false ElemType; /顺序栈中元素类型typedef struct ElemType dataMaxSize; /存放元素 int top; /栈顶指针 StackType; /声明顺序栈类型void InitStack(StackType *&s) /初始化栈 s=(StackType *)malloc(sizeof(StackType); s-top=-1;void Des
8、troyStack(StackType *&s) /销毁栈 free(s);bool StackEmpty(StackType *s) /判断栈是否为空 return(s-top=-1);bool Push(StackType *&s,ElemType e) /进栈 if (s-top=MaxSize-1) return false; s-top+; s-datas-top=e; return true;bool Pop(StackType *&s,ElemType &e) /出栈 if (s-top=-1) return false; e=s-datas-top; s-top-; retur
9、n true;void Hanoi2(int n, char x, char y, char z) StackType *st; /定义顺序栈指针 ElemType e,e1,e2,e3; if (n=0) return; /参数错误时直接返回 InitStack(st); /初始化栈 e.n=n; e.x=x; e.y=y; e.z=z; e.flag=false; Push(st,e); /元素e进栈 while (!StackEmpty(st) /栈不空循环 Pop(st,e); /出栈元素e if (e.flag=false) /当不能直接移动盘片时 e1.n=e.n-1; e1.x=
10、e.y; e1.y=e.x; e1.z=e.z; if (e1.n=1) /只有一个盘片时可直接移动 e1.flag=true; else /有一个以上盘片时不能直接移动 e1.flag=false; Push(st,e1); /处理Hanoi(n-1,y,x,z)步骤 e2.n=e.n; e2.x=e.x; e2.y=e.y; e2.z=e.z; e2.flag=true; Push(st,e2); /处理move(n,x,z)步骤 e3.n=e.n-1; e3.x=e.x; e3.y=e.z; e3.z=e.y; if (e3.n=1) /只有一个盘片时可直接移动 e3.flag=true
11、; else e3.flag=false; /有一个以上盘片时不能直接移动 Push(st,e3); /处理Hanoi(n-1,x,z,y)步骤 else /当可以直接移动时 printf(t将第%d个盘片从%c移动到%cn,e.n,e.x,e.z); DestroyStack(st); /销毁栈int main() int n=3; printf(递归算法:%d个盘片移动过程:n,n); Hanoi1(n,X,Y,Z); printf(非递归算法:%d个盘片移动过程:n,n); Hanoi2(n,X,Y,Z); return 1;实验截图五、实验总结 对于不是尾递归的复杂递归算法,在理解递归调用实现过程的基础上可以用栈来模拟递归执行过程,从而将其转换为等价的非递归算法。可以让栈中的每一个元素对应一个求解任务,可用flag来标识该任务是否可以直接移动盘片。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1