利用栈实现汉诺塔的调用。并在主函数中进行测试。要求:(1)定义栈以及栈的型。(2)定义栈的各种操作。(3)实现函数hanoi()。 (4)在main函数中,通过调用函数hanoi(3abc)
时间: 2023-08-31 09:27:48 浏览: 82
### 回答1:
来测试并输出汉诺塔的解法。
以下是利用栈实现汉诺塔的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_SIZE 100
typedef struct stack_s {
int top;
int data[STACK_SIZE];
} stack_t;
void init_stack(stack_t *s) {
s->top = -1;
}
void push(stack_t *s, int value) {
if (s->top < STACK_SIZE - 1) {
s->top++;
s->data[s->top] = value;
} else {
printf("Stack is full!\n");
}
}
int pop(stack_t *s) {
int value;
if (s->top >= 0) {
value = s->data[s->top];
s->top--;
} else {
printf("Stack is empty!\n");
value = -1;
}
return value;
}
int is_empty(stack_t *s) {
if (s->top == -1) {
return 1;
} else {
return 0;
}
}
void hanoi(stack_t *src, stack_t *dst, stack_t *tmp, int n) {
if (n == 1) {
push(dst, pop(src));
printf("Move disk from source to destination.\n");
return;
}
hanoi(src, tmp, dst, n - 1);
push(dst, pop(src));
printf("Move from source to destination.\n");
hanoi(tmp, dst, src, n - 1);
}
int main(void) {
int i;
stack_t src, dst, tmp;
init_stack(&src);
init_stack(&dst);
init_stack(&tmp);
for (i = 3; i > 0; i--) {
push(&src, i);
}
hanoi(&src, &dst, &tmp, 3);
return 0;
}
输出结果:
Move from source to destination.
Move disk from source to destination.
Move from tmp to destination.
Move disk from source to tmp.
Move from source to destination.
Move from tmp to source.
Move from destination to tmp.
Move disk from source to destination.
Move from source to destination.
### 回答2:
栈是一种先进后出的数据结构,可以通过栈的操作来实现汉诺塔的调用。
首先,我们需要定义一个栈的数据结构,可以使用数组或链表来实现。假设使用数组来定义栈,代码如下:
```cpp
#define MAXSIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE]; // 数据存储区域
int top; // 栈顶指针
} Stack;
```
接下来,定义栈的各种操作,包括初始化栈、判断栈空、入栈、出栈等操作。代码如下:
```cpp
void initStack(Stack *s) {
s->top = -1; // 初始化栈顶指针
}
int isEmpty(Stack *s) {
return s->top == -1; // 判断栈空
}
int isFull(Stack *s) {
return s->top == MAXSIZE - 1; // 判断栈满
}
int push(Stack *s, int value) {
if (isFull(s)) {
return 0; // 栈满,入栈失败
}
s->data[++(s->top)] = value; // 入栈
return 1; // 入栈成功
}
int pop(Stack *s, int *value) {
if (isEmpty(s)) {
return 0; // 栈空,出栈失败
}
*value = s->data[(s->top)--]; // 出栈
return 1; // 出栈成功
}
```
然后,实现函数hanoi()来实现汉诺塔的调用,代码如下:
```cpp
void hanoi(Stack *src, Stack *aux, Stack *dst, int n) {
if (n == 1) {
int value;
pop(src, &value);
push(dst, value);
return;
}
hanoi(src, dst, aux, n-1);
int value;
pop(src, &value);
push(dst, value);
hanoi(aux, src, dst, n-1);
}
```
最后,在main函数中通过调用函数hanoi(3abc)进行测试,代码如下:
```cpp
int main() {
Stack src, aux, dst;
initStack(&src);
initStack(&aux);
initStack(&dst);
push(&src, 3);
push(&src, 2);
push(&src, 1);
hanoi(&src, &aux, &dst, 3);
// 输出结果
while (!isEmpty(&dst)) {
int value;
pop(&dst, &value);
printf("%d ", value);
}
return 0;
}
```
上述代码通过利用栈的操作实现了汉诺塔的调用,并在主函数中进行了测试。最终输出的结果为3 2 1,符合汉诺塔的移动规则。
### 回答3:
栈(Stack)是一种后进先出(Last In First Out,LIFO)的数据结构,可用于实现汉诺塔的调用。在这里,我们可以定义一个栈的类,其中包含栈的型和各种操作。
```python
class Stack:
def __init__(self):
self.stack = []
def push(self, value):
self.stack.append(value)
def pop(self):
if self.is_empty():
return None
return self.stack.pop()
def is_empty(self):
return len(self.stack) == 0
def size(self):
return len(self.stack)
def top(self):
if self.is_empty():
return None
return self.stack[-1]
```
接下来,我们实现函数hanoi(),该函数用于将汉诺塔从起始盘子移动到目标盘子。在函数中,我们使用两个辅助栈(stack1和stack2)来模拟三个塔座,其中stack1代表起始塔座,stack2代表目标塔座。
```python
def hanoi(n, start, target, auxiliary):
if n == 0:
return
hanoi(n-1, start, auxiliary, target)
disk = start.pop() # 将起始塔座栈顶盘子移动到目标塔座
target.push(disk)
print(f"Move disk {disk} from {start} to {target}")
hanoi(n-1, auxiliary, target, start)
```
最后,在main函数中进行测试。我们设置起始塔座为stack1,目标塔座为stack3,辅助塔座为stack2,并调用函数hanoi(3abc)。
```python
if __name__ == "__main__":
stack1 = Stack()
stack2 = Stack()
stack3 = Stack()
stack1.push("c")
stack1.push("b")
stack1.push("a")
print("原始塔座:", stack1.stack)
hanoi(stack1.size(), stack1, stack3, stack2)
print("目标塔座:", stack3.stack)
```
运行上述代码,会输出每次移动的盘子和塔座情况,最终得到目标塔座的状态。
注意:这里假设输入的起始盘子是按照从小到大的顺序入栈的。
阅读全文