C语言用栈与递归模拟汉诺塔
题目:有三个柱子X,Y, Z......你懂的。
一)实现过程
盘子用整数模拟;
柱子X,Y,Z用栈模拟;
hannota函数递归实现;
move函数为移动盘子操作;
二)结果
三)个人理解的几点:
1)把汉洛塔函数与move函数分开更容易理解。
2)自己独立写一遍理解会更深,大家动手吧。
3)不足之处大家敬请指正。
四)参考书籍:数据结构(清华大学出版社 严蔚敏)
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;//盘子的结构
typedef struct//柱子(栈)的结构
{
char name;
ElemType* base;
ElemType* top;
}StackType;
int initstack(StackType* s,char name)
{
s->name=name;
s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(s->base==NULL)
exit(0);
s->top=s->base;
return 1;
}
int push(StackType* s,ElemType e)
{
if(s->top-s->base>=MAXSIZE)
exit(0);
*(s->top)=e;
s->top++;
return 1;
}
ElemType pop(StackType* s)
{
if(s->top==s->base)
exit(0);
s->top--;
return *(s->top);
}
int main()
{
int all;
int i;
StackType X;
StackType Y;
StackType Z;
initstack(&X,'X');
initstack(&Y,'Y');
initstack(&Z,'Z');
while(1)
{
printf("请输入X柱子开始有多少个盘子\n");
scanf("%d",&all);
for(i=all;i>0;i--)
{
push(&X,i);
}
hannota(all,&X,&Y,&Z);
}
return 1;
}
int hannota(int n,StackType* x,StackType* y,StackType* z)
{
if(1==n)
{
move(x,z);
return 1;
}
hannota(n-1,x,z,y);//先解决n-1个盘子移到辅助柱子Y的汉洛塔问题
move(x,z);//最后一个从x移到Z
hannota(n-1,y,x,z);//解决n-1个盘子移到柱子z的汉洛塔问题
return 1;
}
int move(StackType* x,StackType* y)
{
ElemType e;
e=pop(x);
push(y,e);
printf("%c move to %c\n",x->name,y->name);
return 1;
}