前边写的数值转换是利用栈的先进后出的性质保存数字的各位数,行编辑是利用栈的只允许在一端进行操作的特性,迷宫问题中栈保存走过的通道块,栈还可以辅助递归的实现,汉诺塔就是一个典型的例子
汉诺塔问题描述:塔X上的圆盘全部移动到塔Z,且移动过程中,小盘始终位于大盘上方。解决思路就是欲将n个圆盘从X移动到Z,只需先移动前n-1个圆盘到辅助塔Y,再将剩下的一个圆盘从X移动到Z,最后再以X作为辅助塔,将余下的n-1个圆盘从Y移动到Z
Hanoi.h文件
/**********************************
文件路径:3 栈和队列\Hanoi
文件名称:Hanoi.h
实现功能:声明汉诺塔程序中需要用的函数
编写时间:2018.8.14
**********************************/
#ifndef HANOI_H
#define HANOI_H
#include<stdio.h>
int gStep;//统计移动步数(全局变量)
//将塔座x上按直径有小到大且自上而下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座
void hanoi(int n,char x,char y,char z);
//把第n个圆盘从x移到z
void move(char x,int n,char z);
#endif
Hanoi.cpp文件
/**********************************
文件路径:3 栈和队列\Hanoi
文件名称:Hanoi.cpp
实现功能:实现汉诺塔程序中需要用的函数
编写时间:2018.8.14
**********************************/
#ifndef HANOI_CPP
#define HANOI_CPP
#include"Hanoi.h"
//将塔座x上按直径有小到大且自上而下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座
void hanoi(int n,char x,char y,char z){
if(n==1)
move(x,1,z);//把编号为1的圆盘从x移到z
else{
hanoi(n-1,x,z,y);//把x上编号为1至n-1的圆盘移到y,z作辅助塔
move(x,n,z);//将编号为n的圆盘从x移到z
hanoi(n-1,y,x,z);
}
}
//把第n个圆盘从x移到z
void move(char x,int n,char z){
gStep++;
printf("Move disk %d from %c to %c\n",n,x,z);
}
#endif
Hanoi-Test.cpp文件
/**********************************
文件路径:3 栈和队列\Hanoi
文件名称:Hanoi-Test.cpp
实现功能:测试汉诺塔算法
编写时间:2018.8.14
**********************************/
#include"Hanoi.cpp"
int main(){
int n=5;//假设有5个圆盘
char x='x';
char y='y';
char z='z';
printf("将%d个圆盘从x塔座移到z塔座的操作步骤如下:\n",n);
hanoi(n,x,y,z);
printf("共用了%d步\n",gStep);
return 0;
}