汉诺塔系统工作栈的变化图c语言,汉诺塔栈c语言.doc

汉诺塔栈c语言

计算机科学与工程学院

《算法与数据结构》试验报告[二]

专业班级10级计算机工程02试验地点计算机大楼计工教研室学生学号1005080222指导教师蔡琼学生姓名肖宇博试验时间2012-4-14试验项目算法与数据结构试验类别基础性() 设计性() 综合性(√) 其它( )试验目的及要求(1)掌握栈的特点及其存储方法;

(2)掌握栈的常见算法以及程序实现;

(3)了解递归的工作过程。

成 绩 评 定 表类 别评 分 标 准分值得分合 计上机表现积极出勤、遵守纪律

主动完成设计任务30分程序与报告程序代码规范、功能正确

报告详实完整、体现收获70分备注:

评阅教师: 日 期: 年 月 日试 验 内 容

一、实验目的和要求

1、实验目的:

(1)掌握栈的特点及其存储方法;

(2)掌握栈的常见算法以及程序实现;

(3)了解递归的工作过程。

2、实验内容

Hanoi塔问题。(要求4个盘子移动,输出中间结果)

3、实验要求:

要求实现4个盘子的移动,用递归和栈实现。

设计分析

三个盘子Hanoi求解示意图如下:

三个盘子汉诺塔算法的运行轨迹:

源代码

#include

#include

#define maxsize 20

typedef int datatype; //数据结构的类型

typedef struct

{

int top;

datatype data[maxsize];

char flat;

}sqstack; //栈的定义

void inisqstack(sqstack *&s,char ch) //初始化函数!

{

s=(sqstack *)malloc(sizeof(sqstack));

s->top=-1;

s->flat=ch;

}

void push(sqstack *&s,datatype e) //进栈函数

{

s->top++;

s->data[s->top]=e;

}

void pop(sqstack *&s,datatype &e) //出栈函数

{

e=s->data[s->top];

s->top--;

}

void Dispstack(sqstack *s) //显示函数

{

for(int i=s->top;i>=0;i--)

{

printf("%d\t",s->data[i]);

}

printf("\n");

}

void Hanio(int n,sqstack *A,sqstack *B,sqstack *C) //汉诺塔主程序

{

int e1;

if(n==1)

{

printf("把%c的%d号盘移到到%c\n",A->flat,A->data[A->top],C->flat);

pop(A,e1);

push(C,e1);

printf("-----%c还剩下-------------",A->flat);

if(A->top==-1)

{

printf("0");

printf("\n");

}

else

Dispstack(A);

printf("-----%c还剩下-------------",B->flat);

if(B->top==-1)

{

printf("0");

printf("\n");

}

else

Dispstack(B);

printf("-----%c还剩下-------------",C->flat);

if(C->top==-1)

{

printf("0");

printf("\n");

}

else

Dispstack(C);

}

else

{

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

pop(A,e1);

push(C,e1);

printf("把%c的%d号盘移到到%c\n",A->flat,e1,C->flat);

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

}

}

void main()

{

sqstack *A,*B,*C;

int m;

inisqstack(A,'A');

inisqstack(B,'B

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值