用c语言栈测试“汉诺塔”问题
时间: 2023-11-19 15:05:08 浏览: 46
以下是用C语言实现汉诺塔问题的代码:
```c
#include <stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c->%c\n", A, C);
}
else
{
hanoi(n - 1, A, C, B);
printf("%c->%c\n", A, C);
hanoi(n - 1, B, A, C);
}
}
int main()
{
int n;
printf("请输入汉诺塔的盘数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
在这个程序中,我们定义了一个递归函数hanoi来求解汉诺塔问题。函数的参数包括:
- n:表示当前要移动的盘子数目;
- A:表示起始柱子;
- B:表示中间柱子;
- C:表示目标柱子。
当n等于1时,我们直接将起始柱子上的盘子移动到目标柱子上;否则,我们先将n-1个盘子从起始柱子移动到中间柱子上,然后将第n个盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从中间柱子移动到目标柱子上。
在main函数中,我们首先输入汉诺塔的盘数,然后调用hanoi函数来解决问题。最终,程序会输出一系列移动步骤,将所有盘子从起始柱子移动到目标柱子上。
相关问题
用c语言栈测试“汉诺塔”问题。
以下是使用C语言的栈来解决“汉诺塔”问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int n; // 盘子编号
char from; // 源柱子
char to; // 目标柱子
char aux; // 中间柱子
} Move;
typedef struct {
Move *data;
int top;
int capacity;
} Stack;
Stack* createStack(int capacity) {
Stack *stack = (Stack*) malloc(sizeof(Stack));
stack->data = (Move*) malloc(capacity * sizeof(Move));
stack->top = -1;
stack->capacity = capacity;
return stack;
}
void destroyStack(Stack *stack) {
free(stack->data);
free(stack);
}
void push(Stack *stack, Move move) {
if (stack->top == stack->capacity - 1) {
printf("Stack overflow!\n");
exit(1);
}
stack->top++;
stack->data[stack->top] = move;
}
Move pop(Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow!\n");
exit(1);
}
Move move = stack->data[stack->top];
stack->top--;
return move;
}
void hanoi(int n, char from, char to, char aux) {
Stack *stack = createStack(n);
push(stack, (Move) { n, from, to, aux });
while (stack->top != -1) {
Move move = pop(stack);
if (move.n == 1) {
printf("Move disk %d from %c to %c\n", move.n, move.from, move.to);
} else {
push(stack, (Move) { move.n - 1, move.aux, move.to, move.from });
push(stack, (Move) { 1, move.from, move.to, move.aux });
push(stack, (Move) { move.n - 1, move.from, move.aux, move.to });
}
}
destroyStack(stack);
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
hanoi(n, 'A', 'C', 'B');
return 0;
}
```
在这个示例中,我们定义了一个`Move`结构体来表示每次移动的操作,其中包括盘子的编号、源柱子、目标柱子和中间柱子。我们还定义了一个`Stack`结构体来表示栈,其中包括栈的数据、栈顶指针和容量。
我们使用`createStack`函数来创建一个指定容量的栈,并使用`destroyStack`函数来销毁栈。我们使用`push`函数来将一个操作压入栈中,并使用`pop`函数来从栈中弹出一个操作。
在`hanoi`函数中,我们首先创建一个栈,并将起始操作压入栈中。然后,我们循环执行以下操作:
1. 弹出栈顶的操作,如果这个操作只需要移动一个盘子,就直接输出移动的步骤;
2. 否则,我们将这个操作拆分成三个子操作,分别是将前n-1个盘子从源柱子移动到中间柱子、将第n个盘子从源柱子移动到目标柱子、将前n-1个盘子从中间柱子移动到目标柱子。将这三个子操作依次压入栈中。
最后,我们在主函数中读取用户输入的盘子数量,然后调用`hanoi`函数来解决“汉诺塔”问题。
C语言栈完成汉诺塔算法
好的,以下是C语言栈完成汉诺塔算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int elem[MAXSIZE];
int top;
} Stack;
void InitStack(Stack *S) {
S->top = -1;
}
int StackEmpty(Stack *S) {
if (S->top == -1) {
return 1;
} else {
return 0;
}
}
int Push(Stack *S, int e) {
if (S->top == MAXSIZE - 1) {
return 0;
} else {
S->top++;
S->elem[S->top] = e;
return 1;
}
}
int Pop(Stack *S, int *e) {
if (StackEmpty(S)) {
return 0;
} else {
*e = S->elem[S->top];
S->top--;
return 1;
}
}
void move(char x, char y) {
printf("%c -> %c\n", x, y);
}
void Hanoi(int n, char x, char y, char z) {
Stack S;
InitStack(&S);
int e;
Push(&S, n);
while (!StackEmpty(&S)) {
while (Pop(&S, &e) && e > 1) {
Push(&S, e - 1);
Push(&S, 0);
Push(&S, e - 1);
}
if (e == 1) {
move(x, z);
}
while (Pop(&S, &e) && e == 0) {
move(x, y);
Push(&S, 0);
}
if (e > 1) {
Push(&S, e - 1);
move(x, z);
Push(&S, 0);
Push(&S, e - 1);
}
}
}
int main() {
int n;
printf("请输入盘子的个数:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
```
在这个示例代码中,我们使用了栈来模拟汉诺塔算法中的递归过程。具体来说,我们定义了一个栈结构体,包括一个数组和一个栈顶指针。我们使用栈来记录每个递归函数调用时的参数,以及返回时需要执行的操作。其中,当栈顶元素为0时,表示需要将上一个元素从x移动到y;当栈顶元素为正整数时,表示需要将上一个元素从x移动到z,并将下一个元素从x移动到y。
在主函数中,我们首先读取用户输入的盘子个数,然后调用Hanoi函数进行汉诺塔求解。在Hanoi函数中,我们首先将汉诺塔问题的初始状态压入栈中,然后进入循环,直到栈为空。在循环中,我们首先将栈顶元素不断拆分,直到其变为1,表示可以直接将盘子从x移动到z。然后,我们将栈中的0全部弹出,将上一个元素从x移动到y,并将0压入栈中。最后,如果栈顶元素大于1,则将其拆分,并将上一个元素从x移动到z。最终,当栈为空时,汉诺塔问题的求解完成。
希望这个示例代码能够帮助你理解使用栈完成汉诺塔算法的思路。