C语言用栈与递归模拟汉诺塔

题目:有三个柱子X,Y, Z......你懂的。

一)实现过程

盘子用整数模拟;

柱子X,Y,Z用栈模拟;

hannota函数递归实现;

move函数为移动盘子操作;


二)结果

C语言用栈与递归模拟汉诺塔


三)个人理解的几点:

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;
}