DS_汉诺塔非递归C++实现

//因为递归的调用浪费了许多空间,所以我们处理递归问题的时候,很容易想到整一个plus版,只保留必要的信息,而省略函数返回地址,函数参数之类的东西。或者干脆不使用递归,通过找到规律,用其他方法实现。
//现在,处理汉诺塔问题时,发现时间复杂度很高,2的n次方级别,以及空间很浪费,储存了函数返回地址和函数参数之类的。当然,目前本菜鸟不知道怎么降低时间复杂度,现在只知道把汉诺塔的递归转换成栈。(其实本质没变,时间复杂度不变,只是节省了一丢丢空间)
//今天懒,细节先不说了。大概要注意一下入栈和出栈顺序是反着的。

// DS_NonRecursion_Hanoi.cpp : 定义控制台应用程序的入口点。
//

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

class HanoiNode
{
public:
	HanoiNode(int n0, char a0, char b0, char c0) :n(n0), a(a0), b(b0), c(c0){}
	int n;
	char a, b, c;
};

void Hanoi(int n, char a, char b, char c)
{
	stack<HanoiNode> stackH;
	stackH.push(HanoiNode(n, a, b, c));
	while (!stackH.empty())
	{
		HanoiNode temp = stackH.top();
		stackH.pop();
		n = temp.n;
		a = temp.a;
		b = temp.b;
		c = temp.c;
		if (1 == n)
			cout << "put the plate from " << a << " to " << c << endl;
		else
		{
			stackH.push(HanoiNode(n - 1, b, a, c));
			stackH.push(HanoiNode(1, a, b, c));
			stackH.push(HanoiNode(n - 1, a, c, b));
		}
	}
	
}

int main()
{
	Hanoi(9, 'a', 'b', 'c');
	system("pause");
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值