#include <iostream>
using namespace std;
typedef struct {
int n;
char a, b, c;
} Quad;
#define InitSize 100
#define StackIncrement 50
typedef Quad ElemType;
typedef struct { //顺序栈定义
ElemType* elem; //栈数组
int top; //或ElemType*,栈顶指针
int size; //栈大小
} SeqStack;
int InitStack(SeqStack& S) { //初始化
S.elem = new ElemType[InitSize];
if (!S.elem) exit(1);
S.top = -1;
S.size = InitSize;
return 1;
}
int IsEmpty(const SeqStack& S) {
//判断栈是否空,空则返回1,否则返回0
return S.top == -1;
}
int IsFull(const SeqStack& S) {
//判断栈是否,满则返回1,否则返回0
return S.top == S.size;
}
int Push(SeqStack& S, ElemType& e) {
//若栈满返回0, 否则新元素 e 进栈并返回1
if (IsFull(S)) return 0;
S.top++; //先移动指针
S.elem[S.top] = e; //再加入新元素
return 1;
}
int Pop(SeqStack& S, ElemType& e) {
//若栈空返回0, 否则栈顶元素退出到e并返回1
if (IsEmpty(S)) return 0;
e = S.elem[S.top]; S.top--;
return 1;
}
int GetTop(const SeqStack& S, ElemType& e) {
//若栈空返回0, 否则栈顶元素读到e并返回1
if (IsEmpty(S)) return 0;
e = S.elem[S.top];
return 1;
}
void Hanoi(int n, char A, char B, char C) {
SeqStack S; InitStack(S);
Quad q;
q.n = n; q.a = A; q.b = B; q.c = C;
Push(S, q);
//初始化完毕
while (!IsEmpty(S)) {
Pop(S, q); //取当前问题
n = q.n; A = q.a; B = q.b; C = q.c;
if (n == 1) {
printf("Move disk from peg %c to peg %c\n", A,C);
}
else {
q.n = n - 1; q.a = B; q.b = A; q.c = C;
Push(S, q); //右
q.n = 1; q.a = A; q.b = B; q.c = C;
Push(S, q); //中
q.n = n - 1; q.a = A; q.b = C; q.c = B;
Push(S, q); //左
}
}
}
int main(){
char A='A', B='B', C='C';
int n; cout << "请输入盘子个数:";
cin >> n;
Hanoi(3, A, B, C);
}