#include<iostream>
#include <stack>
using namespace std;
void Move(int n, char A, char B)
{
cout << "move " << n << " from " << A << " to " << B << endl;
}
//递归中序遍历
void Hannio(int n, char A, char B, char C)
{
if (n > 0)
{
Hannio(n-1, A, C, B);
Move(n, A, B);
Hannio(n-1, C, B, A);
}
}
//非递归实现汉诺塔
struct HannioData
{
int n;
char src;
char mid;
char dest;
HannioData(int n, char A, char B, char C)
{
this->n = n;
src = A;
mid = B;
dest = C;
}
};
/*
//这个算法没有下面的算法好!!!
void NonReversiveHannoi(int n, char A, char B, char C)
{
HannioData data(n, A, B, C);
stack<HannioData> s;
s.push(data);
while (!s.empty())
{
while (data.n > 0)
{
data = HannioData(data.n-1, data.src, data.dest, data.mid);
s.push(data);
}
s.pop(); //因为data.n==0也进去了,所以这步是必须的!!
if (!s.empty())
{
data = s.top();
s.pop();
Move(data.n, data.src, data.mid);
data = HannioData(data.n-1, data.dest, data.mid, data.src);
s.push(data); //这步在这里是必须的。因为是先加入后判断的。
}
}
}
*/
void NonReversiveHannoi(int n, char A, char B, char C)
{
HannioData data(n, A, B, C);
stack<HannioData> s;
while (data.n>0 ||!s.empty())
{
while (data.n > 0)
{
s.push(data);
data = HannioData(data.n-1, data.src, data.dest, data.mid);
}
if (!s.empty())
{
data = s.top();
s.pop();
Move(data.n, data.src, data.mid);
data = HannioData(data.n-1, data.dest, data.mid, data.src);
}
}
}
int main()
{
cout << "递归实现" << endl;
Hannio(3, 'A', 'B', 'C');
cout << "非递归实现" << endl;
NonReversiveHannoi(3, 'A', 'B', 'C');
return 0;
}