数据结构 汉诺塔 递归与非递归的实现

递归算法

#include<stdio.h>

#include"time.h"

static int c=0;

void move(char x,int n,char z)

{//移动函数

printf("第%d步: 将第%i个盘子从%c 盘移动到%c \n",++c,n,x,z);

}

void hanoi(int n,char x,char y,char z)

{汉诺塔递归函数

if(n==1)

move(x,1,z);

else

{

hanoi(n-1,x,z,y);

move(x,n,z);

hanoi(n-1,y,x,z);

}

}

int main()

{

int n;

time_t   start,end;

printf("请输入圆盘的个数: ");

scanf("%d", &n);

start=time(NULL);//计算时间开始

hanoi(n,'A','B','C');

end=time(NULL);//计算时间结束

printf("time = %f seconds\n",difftime(end,start));

return 0;

}

非递归

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#include"time.h"

#define TRUE 1

#define FALSE 0

#define YES 1

#define NO 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int SElemType;

typedef int Status;

#define STACK_INIT_SIZE 100

#define STACKINCREMENT  20

int count;

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

Status InitStack(SqStack *s)

{

s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!s->base)

{

exit(OVERFLOW);

}

s->top=s->base;

s->stacksize=STACK_INIT_SIZE;

    

return OK;

}

Status GetTop(SqStack *s,SElemType *e)//判断栈是否为空,不为空返回栈顶元素

{

if(s->top == s->base)

{

return ERROR;

}

*e = *(s->top-1);

return OK;

}

Status StackEmpty(SqStack *s)               //判断栈是否为空

{

if(s->top == s->base)

        return TRUE;

else

        return FALSE;

}

Status Push(SqStack *s,int n,SElemType x,SElemType y,SElemType z)//压栈函数,插入元素e为新的栈顶元素

{

if(s->top - s->base >= s->stacksize)

{

s->base = (SElemType *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(SElemType));

        if(!s->base) exit (OVERFLOW);

        s->top = s->base + s->stacksize;

        s->stacksize += STACKINCREMENT;

}

    *s->top ++ = n;                                                                   //顺序压栈

*s->top ++ = x;

    *s->top ++ = y;

    *s->top ++ = z;

return OK;

}

Status Pop(SqStack *s,int *n,SElemType *x,SElemType *y,SElemType *z)                 //若栈不为空,则删除s的栈顶元素,用e返回其值。

{

if(s->top == s->base)

return ERROR;

  

*z = * --s->top;                                                                 //逆序出栈

    *y = * --s->top;

    *x = * --s->top;

    *n = * --s->top;

return OK;

}

void Move(SElemType x,int n,SElemType z)

{

    printf("%d: move disk %d from %d to %d\n", ++count, n, x, z);

}

void hanoi(SqStack *s,  SElemType n,SElemType x,SElemType y,SElemType z)

{

    

    Push(s,n,x,y,z);

    while  (!StackEmpty(s))                         //栈非空

    {

        Pop(s,&n,&x,&y,&z);

        if ((y==-1)||(n ==1))

            Move(x, n, z);                          //不需要y或只剩1号盘

        else

        {   Push(s,n-1,y,x,z);

            Push(s,n,x,-1,z);

            Push(s,n-1,x,z,y);

        }

    }

    

    

}

int main()

{

    int n;

time_t   start,end;

    SqStack s;

    InitStack(&s);

    printf("请输入汉诺塔的层数N");

    scanf("%d",&n);

start=time(NULL);//计算时间开始

hanoi(&s,n,1 ,2 ,3);

end=time(NULL);//计算时间结束

printf("time = %f seconds\n",difftime(end,start));

    return 0;

    

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值