}
主程序:
#include
#include
//from指要转移的盘子的柱子,pass指经过的中间柱子,aim指目的盘子所在的柱子
structTree//树结点
{
intn;
charfrom;
charpass;
charaim;
//构造函数
Tree(intm,chara,charb,charc)
{
n=m;
from=a;
pass=b;
aim=c;
}
Tree(){}
//判断是否为空结点
boolIsNullNode()
{
if(n<1)
returntrue;
returnfalse;
}
};
//栈,用来存放盘子
classStack
{
Tree*data;
inttop;
intmaxSize;
public:
Stack(intsz);
~Stack();
boolIsEmpty();//判断是否为空栈
boolIsFull();//判断是否为满栈
boolPush(Treex);//进栈
boolPush(intm,chara,charb,charc);//进栈
boolPop(Tree&x);//出栈
boolGetTop(Tree&x);//取栈顶
};
Stack:
:
Stack(intsz)//构造函数
{
maxSize=sz;
data=newTree[maxSize];
top=-1;
}
Stack:
:
~Stack()//析构函数
{
delete[]data;
}
//判断是否为空栈
boolStack:
:
IsEmpty()
{
if(top==-1)
returntrue;
returnfalse;
}
//判断是否为满栈
boolStack:
:
IsFull()
{
if(top==maxSize-1)
returntrue;
returnfalse;
}
//出栈
boolStack:
:
Pop(Tree&x)
{
if(IsEmpty())
returnfalse;
x=data[top--];
returntrue;
}
boolStack:
:
Push(Treex)
{
if(IsFull())
returnfalse;
data[++top]=x;
returntrue;
}
boolStack:
:
Push(intm,chara,charb,charc)
{
if(IsFull())
returnfalse;
top++;
data[top].n=m;
data[top].aim=c;
data[top].from=a;
data[top].pass=b;
returntrue;
}
boolStack:
:
GetTop(Tree&x)
{
if(IsEmpty())
returnfalse;
x=data[top];
returntrue;
}
//from指要转移的盘子,aim指目的盘子,pass指经过上午中间盘子
voidHanNuoTa(intn,chara,charb,charc)
{
Stacks(n+1);
Treep;
inti=1;
s.Push(n,a,b,c);
while(!
s.IsEmpty())
{
s.GetTop(p);
while(!
p.IsNullNode())
{
s.Push(p.n-1,p.from,p.aim,p.pass);//左孩子进栈
s.GetTop(p);
}
s.Pop(p);//退栈
if(!
s.IsEmpty())//栈不空
{
s.Pop(p);//退栈
cout<<"第"<"<
s.Push(p.n-1,p.pass,p.from,p.aim);//右孩子
}
}
}
voidHanNuoTaDiGui(intn,chara,charb,charc);
voidmunu();
voidmain()
{
system("color1f");/*设置系统颜色,本系统为蓝底亮白色字*/
munu();
while(true)
{
intn,num;
cout<<"请输入您的选择:
";
cin>>n;
switch(n)
{
case0:
gotoloop;
case1:
//1代表递归方法
cout<<"请输入圆盘个数:
";
cin>>num;
HanNuoTaDiGui(num,'A','B','C');
munu();
break;
case2:
//2代表非递归方法
cout<<"请输入圆盘个数:
";
cin>>num;
HanNuoTa(num,'A','B','C');
munu();
break;
default:
cout<<"您的选择不符合要求,请重新输入!
!
!
!
"<break;
}
}
loop:
cout<<"欢迎再次使用本程序!
"<}
4调试与测试
4.1启动窗口
4.2递归实现
输入圆盘个数为5(也可以是其他数,但不要太大,时间花销大)
4.3非递归实现
输入圆盘个数为5(也可以是其他数,但不要太大,时间花销大)
4.4退出
5致谢
***************
6参考文献
1殷人昆.数据结构用面向对象方法以C++描述(第2版).北京:
清华大学出版社.2007.
2严蔚敏.数据结构.北京:
清华大学出版社.1999
3陈慧南.数据结构.北京:
人民邮电出版社.2005.3
4傅清祥.算法与数据结构.电子工业出版社.2002
5刘振鹏.数据结构.中国铁道出版社.2003.8