线性结构实验 —— 堆栈、队列(汉诺塔的非递归实现)
一、 实验目的
熟练掌握堆栈、队列的两种存储结构实现方式及操作。
练习使用堆栈、队列结构解决问题的能力。
通过算法分析掌握不同存储结构的操作特点。
二、 实验内容和要求
问题描述
汉诺塔的非递归实现借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式
输入为一个正整数N,即起始柱上的盘数。
输出格式
每个操作(移动)占一行,按柱1 -> 柱2的格式输出。
输入样例
3
输出样例:
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
三、算法分析
1. 主流程设计
int main {
输入起始柱上的盘数;
通过借助柱移动盘子到目标柱;
输出盘子从起始柱通过借助柱移动到目标柱的详细步骤;
return 0;
}
2. ADT定义
struct Node //将栈内元素放入一个结构体中
{
char start; //起始柱
char mid; //借助柱
char goal; //目标柱
int num; //起始柱上的盘数
};
typedef int Position; //栈顶位置
typedef struct Node ElementType; //将堆栈的元素类型具体化
//typedef enum { false, true } bool;
/*堆栈的顺序表定义*/
typedef struct SNode* PtrToSNode;
struct SNode
{
ElementType* data; //存储元素的数组
Position Top; //堆栈的栈顶指针
int Maxsize; //堆栈的最大容量
};
typedef PtrToSNode Stack;
Stack CreateStack();
bool IsFull(Stack S);
bool push(Stack S, int n, char a, char b, char c);
bool IsEmpty(Stack S);
ElementType pop(Stack S);
3. 移动流程分析
设计思路:首先起始柱上除了底盘的其他盘子,需要通过目标柱移动到借助柱上,将此时的借助柱看作“目标柱”&