汉诺塔 算法

本文通过C++代码展示了汉诺塔问题的解决过程,包括如何将一个完整的汉诺塔从源堆栈移动到目标堆栈,使用了递归和栈数据结构。程序允许用户输入层数,然后演示了整个移动过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <afxwin.h>
#include <stack>
#include <stdio.h>
using namespace std;


#define nMax 100;
stack<int> Src, Mid, Tar;


void putOutMove()
{
cout<<_T("当前的堆栈为:\n");
cout<<_T("原堆栈为:");
stack<int> Tempstack=Src;
while (!Tempstack.empty())
{
cout<<Tempstack.top()<<_T(" ");
Tempstack.pop();
}
cout<<endl;
cout<<_T("中间堆栈为:");
Tempstack=Mid;
while (!Tempstack.empty())
{
cout<<Tempstack.top()<<_T(" ");
Tempstack.pop();
}
cout<<endl;
cout<<_T("目标堆栈为:");
Tempstack=Tar;
while (!Tempstack.empty())
{
cout<<Tempstack.top()<<_T(" ");
Tempstack.pop();
}
cout<<endl<<_T("---------------------------------")<<endl;
}


int GetTop(stack<int> astack)
{
int nTop=nMax;
if (!astack.empty())
{
nTop=astack.top();
}
return nTop;
}




void move(stack<int> &SrcStack, stack<int> &TarStack)
{
if (!SrcStack.empty())
{
int nSrc=GetTop(SrcStack);
int nTarTop=GetTop(TarStack);
if(nTarTop>nSrc)
{
SrcStack.pop();
TarStack.push(nSrc);
}
}
putOutMove();
}


stack<int> StackTop(stack<int> &SrcStack, int nRemain)
{
if (nRemain<=0)
{
return SrcStack;
}
stack<int> StackTemp;
while (SrcStack.size()>nRemain)
{
int nSrcTop=GetTop(SrcStack);
SrcStack.pop();
StackTemp.push(nSrcTop);
}
stack<int> TarStack;
while (!StackTemp.empty())
{
int nTop=GetTop(StackTemp);
StackTemp.pop();
TarStack.push(nTop);
}
return TarStack;
}


bool moveStackScrToTar(stack<int> &SrcStack, stack<int> &MidStack, stack<int> &TarStack)
{
if (SrcStack.empty() /*&& MidStack.empty()*/)
{
return true;
}
stack<int> StackTemp=StackTop(SrcStack, 1);
moveStackScrToTar(StackTemp, TarStack, MidStack);
move(SrcStack, TarStack);
moveStackScrToTar(MidStack, SrcStack, TarStack);
return true;
}




int main()
{
int n;
while(1)
{
cout<<_T("请输入一个整数");
cin>>n;
for (int i=n; i>0; i--)
{
Src.push(i);
}
putOutMove();
moveStackScrToTar(Src, Mid, Tar);
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值