用栈模拟汉诺塔递归过程

        由于函数递归过程是先进后出的(FILO),所以我们可以创建一个栈来模拟汉诺塔的非递归实现。

递归实现:

1、递归实现代码

#include <stdio.h>

#define TOWER 3  //为移动的层数定义一个TOWER常量

static int num=1;  //定义一个静态变量作为移动次数

void move(char A,char C)

{

    printf("第%d次:\t\t%c----->%c\n",num,A,C); //打印移动过程

    num++;

}

void hannio(int n,char A,char B,char C)  //递归实现移动过程

{

    if(n==1)move(A,C);  //退出出条件

    else

    {   

        hannio(n-1,A,C,B);

        move(A,C);

        hannio(n-1,B,A,C);

    }

}

int main()

{

    hannio(TOWER,'A','B','C');

    printf("按任意键继续……");

    getchar();

    return 0;

}

  1. 用栈模拟递归过程--非递归实现过程

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>

#define SIZE 200   //初始化数据项大小

static int flag = 1;  //记录移动次数

typedef struct   //函数参数结构体作为栈的数据项

{

    int n;

    char A;

    char B;

    char C;

}HannioPara;

typedef HannioPara ElemList;

typedef struct astack   //栈定义

{

    int top;

    int maxtop;

    ElemList *data;

}Astack,*Stack;

Stack StackInit(int size)  //初始化

{

    Stack S = (Stack)malloc(sizeof *S);

    S->data = (ElemList *)malloc(size*sizeof(ElemList));

    S->maxtop = size;

    S->top = -1;

    return S;

}

int EmptyStack(Stack S)  //栈空?

{

    return S->top<0;

}

int FullStack(Stack S)  //栈满

{

    return S->top >= S->maxtop;    

}

ElemList StackTop(Stack S)  //栈顶元素

{

    //if(EmptyStack(S)) return 0;

    return S->data[S->top];     

}

int Push(Stack S,ElemList i)  //压栈

{

    if(FullStack(S))return 0;

    S->data[++S->top]=i;

    return 1;

}

ElemList Pop(Stack S)  //出栈

{

    //if(EmptyStack(S))return 0;

    return S->data[--S->top];

}

void StackShow(Stack S) //打印

{

    while (!(EmptyStack(S)))

    {

        printf("%d%c%c%C\n", S->data[S->top--].n,S->data[S->top--].A,S->data[S->top--].B,S->data[S->top--].C);

    }    

}

void move(char a,char c)  //打印移动过程

{

    printf("第%4d次\t\t%c----->%c\n",flag,a,c);

    flag++;

}

int hannio(int n,char a,char b,char c) //模拟递归实现

{

    Stack S = StackInit(200);

    ElemList tem,tem1,tem2;

    tem.n = n;

    tem.A = a;

    tem.B = b;

    tem.C = c;

    Push(S,tem);//最外层函数最先入栈

    while(S->top > -1) //栈不为空,出栈

    {

        tem1 = StackTop(S);//栈顶元素

        Pop(S); //出栈

        if (tem1.n > 1)

        {

            int n = tem1.n;

            tem2.n = n-1;

            tem2.A = tem1.B;

            tem2.B = tem1.A;

            tem2.C = tem1.C;

            Push(S,tem2);//b,a,c 压栈

            tem2.n = 1;

            tem2.A = tem1.A;

            tem2.C = tem1.C;

            Push(S,tem2);//a.,c 压栈

            tem2.n = n-1;

            tem2.A = tem1.A;

            tem2.B = tem1.C;

            tem2.C = tem1.B;

            Push(S,tem2);//a,c,b 压栈

        }

        else move(tem1.A,tem1.C);

        

    }

    

}

int main()

{

    hannio(3,'A','B','C');  //调用函数

    printf("按任意键继续……");

    fflush(stdin);

    getchar();

    return 0;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值