汉诺塔栈c语言
计算机科学与
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
学院
《算法与数据结构》试验报告[二] 专业班级 10级计算机工程02 试验地点 计算机大楼计工教研室 学生学号 1005080222 指导教师 蔡琼 学生姓名 肖宇博 试验时间 2012-4-14
试验项目 算法与数据结构
试验类别 基础性() 设计性() 综合性(?) 其它( )
(1)掌握栈的特点及其存储
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
; 试
(2)掌握栈的常见算法以及程序实现; 验
(3)了解递归的工作过程。 目
的
及 要
求
成 绩 评 定
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
类 别 评 分 标 准 分值 得分 合 计
积极出勤、遵守纪律
上机表现 30分
主动完成设计任务
程序代码
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
、功能正确
程序与报告 70分
报告详实完整、体现收获
备注:
评阅教师:
日 期: 年 月 日
计算机科学与工程学院
试 验 内 容
一、实验目的和要求
1、实验目的:
(1)掌握栈的特点及其存储方法;
(2)掌握栈的常见算法以及程序实现;
(3)了解递归的工作过程。
2、实验内容
Hanoi塔问题。(要求4个盘子移动,输出中间结果)
3、实验要求:
要求实现4个盘子的移动,用递归和栈实现。 二、设计分析
三个盘子Hanoi求解示意图如下:
C BCBA A
A A A A
(a(b) A BCBA ) C A A A A
(c(d)
)
三个盘子汉诺塔算法的运行轨迹:
递归第三层 递归第二层 Hanio(1,A,B,C) Hanio(2,A,C,B) ?
Move (A,C) 递归第一层 ? Hanio(1,A,B,C) ? Hanio(3,A,B,C) Move (A,B) ? Hanio(1,C,A,B)
Hanio(1,C,A,B) Hanio(2,A,C,B) ? ? Move (C,B) ?
Hanio(3,A,B,C) Hanio(1,B,C,A) Hanio(2,B,A,C) Move (A,B) ? ? Move (B,A) Hanio(1,B,C,A) ? ?
Move (B,C) ? Hanio(2,B,A,C) Hanio(1,A,B,C)
Hanio(1,A,B,C) ? Move (A,C) ?
2 《算法与数据结构》试验报告
计算机科学与工程学院 三、源代码
#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++;
3 《算法与数据结构》试验报告
计算机科学与工程学院
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) //汉诺塔
主程序
4 《算法与数据结构》试验报告
计算机科学与工程学院 {
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");
}
5 《算法与数据结构》试验报告
计算机科学与工程学院
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);
6 《算法与数据结构》试验报告
计算机科学与工程学院
}
}
void main()
{
sqstack *A,*B,*C;
int m;
inisqstack(A,'A');
inisqstack(B,'B');
inisqstack(C,'C');
printf("输入几个盘子");
scanf("%d",&m);
for(int i=m;i>0;i--)
{
push(A,i);
}
Hanio(m,A,B,C);
}
7 《算法与数据结构》试验报告
计算机科学与工程学院 四、测试用例(尽量覆盖所有分支) 1. 正常状态下,输入1无错误后的运行程序如下:
2. 正常状态下,输入2无错误后的运行程序如下:
8 《算法与数据结构》试验报告
计算机科学与工程学院
3.正常状态下,输入3无错误后的运行程序如下:
9 《算法与数据结构》试验报告
计算机科学与工程学院
4(正常状态下,输入4无错误后的运行程序如下:
10 《算法与数据结构》试验报告
计算机科学与工程学院
五、实验
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
本次进行的是汉诺塔递归实现问题,由于是要用到递归和栈那么难度加大了很多。
递归的过程中关于程序执行到那里的问题是困扰我的大问题,并且递归完成后程序到了那里也是一个大问题~ 原来的版本我写了一个很麻烦的程序,它可以将移走的盘的名字都打印出来,并且可以随时看到每个柱子中剩下的盘子,但是这个程序在递归中除了很奇怪的问题,我花了很大的劲都没有改出来,所以才不得不写了这样的一个简单版本。该程序贯彻了我一贯的风格,将用户会出现的错误都考虑在内。并且提供了每次输出的结果~
然而程序并不是最完美的。在今后的实验当中我将会更加的关注递归算法~
11 《算法与数据结构》试验报告
计算机科学与工程学院
12 《算法与数据结构》试验报告