//因为递归的调用浪费了许多空间,所以我们处理递归问题的时候,很容易想到整一个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;
}