重读数据结构之来用递归写个汉诺塔

本文介绍了一种使用递归方法和链栈数据结构解决汉诺塔问题的算法实现。通过定义链栈节点,创建三个链栈分别对应汉诺塔的三根柱子,并利用递归函数进行盘子的移动,最终实现汉诺塔的完整移动过程。

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

递归方法是通过利用系统上一阶段的状态来计算本阶段的状态,类似于“数学归纳法”,由初始阶段状态与状态间的变换函数可得任意阶段的系统输出。

汉诺塔某一层的移动是先进先出,因此可以利用链栈和递归方法来构建并实现汉诺塔问题:

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

//建立链栈的一个节点
typedef struct node
{
	int data;
	struct node *link;
}*stackLink;

int height;//塔高
stackLink topA,topB,topC;//三个链栈的顶节点

//向链栈中增加一个节点
void pushLink(stackLink &topA,int data)
{
	stackLink p;
	p=new node;
	p->data=data;
	p->link=topA;
	topA=p;
}

//链栈中弹出顶点
int popLink(stackLink &topA)
{
	int data;
	stackLink p;
	p=topA;
	data=p->data;
	topA=p->link;
	free(p);
	return data;
}

void makeHanoi(int height,stackLink &topA,stackLink &topB,stackLink &topC)
{
	topA=NULL;
	topB=NULL;
	topC=NULL;
	//向A塔中加入数据,大数在下
	for(int i=height;i>0;--i)
	{
		pushLink(topA,i);
	}
}

//将一块积木移动到另一个塔上
void moveOnce(stackLink &topA,stackLink &topC)
{
	int data;
	if(topA!=NULL)
	{
		data=popLink(topA);
		pushLink(topC,data);
	}
}

//移动汉诺塔,其中多次调用函数自身
void moveHanoi(int height,stackLink &topA,stackLink &topB,stackLink &topC)
{
	stackLink p,q,r;
	p=topA;
	q=topB;
	r=topC;

	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->link;
	}
	while(q!=NULL)
	{
		cout<<q->data<<" ";
		q=q->link;
	}

	while(r!=NULL)
	{
		cout<<r->data<<" ";
		r=r->link;
	}

	if(1==height)
	{
		moveOnce(topA,topC);
	}
	else
	{
		moveHanoi(height-1,topA,topC,topB);
		moveOnce(topA,topC);
		moveHanoi(height-1,topB,topA,topC);
	}
}

int main()
{
	cout<<"input height of Hanoi:"<<endl;
	cin>>height;

	makeHanoi(height,topA,topB,topC);
	moveHanoi(height,topA,topB,topC);

	return 0;
}

这样便实现了汉诺塔算法,当然数据结构上可以采取更简单的例如字符串,但多尝试几种可以变得融会贯通哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值