利用栈实现汉诺塔c语言
时间: 2023-09-03 20:07:34 浏览: 108
用栈实现汉诺塔问题
好的,下面是利用栈实现汉诺塔的代码(使用C语言实现):
```c
#include <stdio.h>
#include <stdlib.h>
#define N 3 // 汉诺塔的盘子数
// 定义栈结构体
struct Stack {
int top; // 栈顶指针
char arr[N]; // 栈数组
};
// 初始化栈
void init_stack(struct Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(struct Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(struct Stack *s) {
return s->top == N-1;
}
// 入栈
void push(struct Stack *s, char c) {
if (is_full(s)) {
printf("Error: stack is full.\n");
exit(1);
}
s->top++;
s->arr[s->top] = c;
}
// 出栈
char pop(struct Stack *s) {
if (is_empty(s)) {
printf("Error: stack is empty.\n");
exit(1);
}
char c = s->arr[s->top];
s->top--;
return c;
}
// 移动盘子
void move(char x, char y) {
printf("%c -> %c\n", x, y);
}
// 利用栈实现汉诺塔
void hanoi() {
struct Stack s1, s2, s3;
init_stack(&s1);
init_stack(&s2);
init_stack(&s3);
// 将盘子从大到小依次入栈s1
for (int i = N; i > 0; i--) {
push(&s1, i+'0');
}
// 判断奇偶性,决定移动顺序
if (N % 2 == 0) {
while (s3.top != N-1) {
if (!is_empty(&s1) && (is_empty(&s2) || s1.arr[s1.top] < s2.arr[s2.top])) {
push(&s2, pop(&s1));
} else {
push(&s1, pop(&s2));
}
if (!is_empty(&s1) && (is_empty(&s3) || s1.arr[s1.top] < s3.arr[s3.top])) {
push(&s3, pop(&s1));
} else {
push(&s1, pop(&s3));
}
if (!is_empty(&s2) && (is_empty(&s3) || s2.arr[s2.top] < s3.arr[s3.top])) {
push(&s3, pop(&s2));
} else {
push(&s2, pop(&s3));
}
}
} else {
while (s3.top != N-1) {
if (!is_empty(&s1) && (is_empty(&s3) || s1.arr[s1.top] < s3.arr[s3.top])) {
push(&s3, pop(&s1));
} else {
push(&s1, pop(&s3));
}
if (!is_empty(&s1) && (is_empty(&s2) || s1.arr[s1.top] < s2.arr[s2.top])) {
push(&s2, pop(&s1));
} else {
push(&s1, pop(&s2));
}
if (!is_empty(&s2) && (is_empty(&s3) || s2.arr[s2.top] < s3.arr[s3.top])) {
push(&s3, pop(&s2));
} else {
push(&s2, pop(&s3));
}
}
}
// 将盘子从s3中依次出栈,完成移动
for (int i = N; i > 0; i--) {
move('A', 'C');
printf("%c -> %c\n", 'A', 'C');
}
}
int main() {
hanoi();
return 0;
}
```
在上面的代码中,我们使用三个栈来模拟汉诺塔的三根柱子。首先将所有盘子从大到小依次入栈s1中,然后根据盘子数的奇偶性,决定移动顺序,依次将盘子从一个栈中取出,经过比较后放入另一个栈中,直到所有盘子都移动到了s3中。最后从s3中依次出栈,完成移动。
希望这个代码对你有所帮助!
阅读全文