汉诺塔栈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