用c++实现了汉诺塔,使用了递归,使用了上一次实现的堆栈这个数据结构来实现的汉诺塔,下面是代码:
stack.h
//
// main.cpp
// StackDemo
//
// Created by xin wang on 4/15/15.
// Copyright (c) 2015 xin wang. All rights reserved.
//
#include <iostream>
class OutOfBounds{//越界异常
public:
OutOfBounds(){
std::cout<<"Out Of Bounds!"<<std::endl;
}
};
//没有空间再进行new操作
class NoMem{
public:
NoMem(){
std::cout<<"No Memory!"<<std::endl;
}
};
template <class T>
class Stack{
public:
Stack(int MaxSize=10);//定义最大长度是10的数组
~Stack(){delete [] stack;}//删除定义的数组
bool IsEmpty()const {return top == -1;}//判断是否为空
bool IsFull() const{return top == MaxTop;}//判断是否是满
T Top()const;
void output();//输出堆栈里的元素
Stack<T>& Add(const T& x);//忘堆栈里面添加元素
Stack<T>& Delete(T& x);//从堆栈里面删除元素
private:
int top;
int MaxTop;
T *stack;
};
//构造函数
template <class T>
Stack<T>::Stack(int MaxSize){
MaxTop=MaxSize-1;
stack = new T[MaxSize];
top = -1;
}
//返回栈顶元素
template<class T>
T Stack<T>::Top()const{
if (IsEmpty()) {
throw OutOfBounds();
}
else{
return stack[top];
}
}
//输出元素
template <class T>
void Stack<T>::output(){
for (int i=0; i<=top; i++) {
std::cout<<stack[i]<<std::endl;
}
}
//往堆栈里面添加元素
template <class T>
Stack<T>& Stack<T>::Add(const T& x){
if (IsFull()) {
throw NoMem();
}else{
stack[++top]=x;
return *this;
}
}
//将栈顶里面的元素删除
template <class T>
Stack<T>& Stack<T>::Delete(T& x){
if (IsEmpty()) {
throw OutOfBounds();
}
x=stack[top--];
return *this;
}
main.cpp
//
// main.cpp
//解决汉诺塔一个非常优雅的方法是使用递归,为了吧最大的碟子移动到塔二
//需要借助塔三的帮助,先把n-1个碟子移动到塔三上,然后把最大的碟子移动到塔二,
//此时塔二上面,有了一个最大的碟子,然后为了把塔三上面的碟子移动到塔二,这样,可以借助塔一的帮助。
//实现用了上次实现的堆栈。所以引入了stack.h
// Created by xin wang on 4/15/15.
// Copyright (c) 2015 xin wang. All rights reserved.
//
#include "stack.h"
Stack<int> *sta[4];//建立一个数组,里面含有4个堆栈,我们需要3个堆栈来模拟3个塔
void TowersOfHanoi(int n,int x,int y,int z){
//表示有n个碟子,从x上面移动到y上面需要借助z的帮助
int d;
if (n>0) {
TowersOfHanoi(n-1, x, z, y);//把n-1个碟子从x上面移动到z上面需要借助y的帮助
sta[x]->Delete(d);
sta[y]->Add(d);
std::cout<<"move top disk from tower "<< x << " to top of tower"<< y <<std::endl;
TowersOfHanoi(n-1, z, y, x);//吧n-1个碟子从z上面移动到x上面借助y
}
}
void TowersOfHanoi(int n){
sta[1] = new Stack<int>(n);
sta[2] = new Stack<int>(n);
sta[3] = new Stack<int>(n);//初始化塔1
for(int d = n;d>0;d--){
sta[1]->Add(d);
}
TowersOfHanoi(n, 1, 2, 3);//调用方法
}
int main(int argc, const char * argv[]) {
TowersOfHanoi(3);
return 0;
}