顺序栈的应用与汉诺塔问题

实验目的

此代码的作用是求解,即将从小到大、由上至下排序的所有圆盘从A柱子移动到C柱子,每次只能移动最上面的圆盘,大盘子不能在小盘子上面。
本文主要是给c语言初学者或数据结构初学者展示,可以作为简单的参考。除了代码外,本文有部分博主自己对代码的简单分析,可以通过下面的链接免费下载。

代码

#include "stdafx.h"
#include <iostream>
using namespace std;

// 定义2个变量
int m_numOfStack = 0; // 当前栈的数量
int m_current = 0; // 当前计算次数

// 编号为n的圆盘(直径从小到大),从A搬运到C,B作为辅助塔
// 只显示移动步骤
void hanoi(int n,char A,char B,char C)
{

	if(n==1)  //最后一次移动 
	{
		m_current= m_current +1; // 当前移动次数加1
		printf("第%d步:移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是1的圆盘从A移到C	
		
	}
	else  // 其他的移动
	{
		hanoi(n-1,A,C,B); // 将编号从1到n-1的圆盘从A移到B,C作为辅助塔
		m_current= m_current +1; // 当前移动次数加1
		printf("第%d步:移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是n的圆盘从A移到C
		hanoi(n-1,B,A,C); // 将编号从1到n-1的圆盘从B移到C,A作为辅助塔
	}
}

// 编号为n的圆盘(直径从小到大),从A搬运到C,B作为辅助塔
// 显示步骤和栈中元素数量变化
void hanoiOfStack(int n,char A,char B,char C)
{
	m_numOfStack =  m_numOfStack + 1; 
	printf("栈的状态:入栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况

	if(n==1)  //最后一次移动 
	{
			
		m_current= m_current +1; // 当前移动次数加1
		printf("圆盘移动过程(第%d步):移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是1的圆盘从A移到C
		
		m_numOfStack =  m_numOfStack - 1;
		printf("栈的状态:出栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况
	}
	else  // 其他的移动
	{
		hanoiOfStack(n-1,A,C,B); // 将编号从1到n-1的圆盘从A移到B,C作为辅助塔
			
		m_current= m_current +1; // 当前移动次数加1
		printf("圆盘移动过程(第%d步):移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是n的圆盘从A移到C

		m_numOfStack =  m_numOfStack - 1;
		printf("栈的状态:出栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况
		hanoiOfStack(n-1,B,A,C); // 将编号从1到n-1的圆盘从B移到C,A作为辅助塔
	}
}

// 主函数
int main(int argc, char* argv[])
{
	int n;
	int flag = 1;
	while(flag)
	{
		printf("\n\n\t\t 1--只显示移动步骤\n");
		printf("\t\t 2--显示步骤和栈中元素数量变化\n");
		printf("\t\t 0--退出程序\n"); 

		cin >> flag;
		
		switch(flag)
		{
			case 1:  // 只显示移动步骤
			{			
				printf("请输入圆盘数量:\n");
				cin >> n;// 获取圆盘数量
				
				printf("\n以下为圆盘移动过程:\n");
				
				m_current = 0; // 初始化移动次数为0
				hanoi(n,'A','B','C'); // 执行移动
				printf("\n圆盘移动结束,共移动了%d次:\n",m_current);
			}				
				break;				
			case 2:  // 显示步骤和栈中元素数量变化
			{
				printf("请输入圆盘数量:\n");
				cin >> n;// 获取圆盘数量
				printf("\n以下为圆盘移动过程和栈中元素数量变化情况:\n");
					
				m_current = 0; // 初始化移动次数为0
				m_numOfStack = 0; // 初始化当前栈中元素个数为0
				hanoiOfStack(n,'A','B','C'); // 执行移动
				printf("\n圆盘移动结束,共移动了%d次:\n",m_current);

			}
				break;
			case 0:  // 退出程序
				break;

			default: // 输入错误
				printf("请输入正确的数字\n");
				break;
		}

	}

	return 0;

}

运行结果

运行结果

免费下载代码解析

CSDN下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值