汉诺塔c++实现

用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;
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/u011337574/article/details/45076371
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞