C++ 栈-汉诺塔

来源:互联网 发布:微信支付没网络能用吗 编辑:程序博客网 时间:2024/06/05 08:08
#include "stdafx.h"#include <iostream>#include <string>using namespace std;template <typename T>struct ChainNode{// 数据成员T elem;ChainNode<T> *next;ChainNode(ChainNode<T> *ptr = NULL){ next = ptr; }   // 不能用new,不是一个完整的类型ChainNode(const T& elem, ChainNode<T> *ptr = NULL){this->elem = elem;next = ptr;}};class MyException{private:string mesg;public:MyException(const char *str) :mesg(const_cast<char*>(str)){  }const char* what(){ return mesg.c_str(); }};// 栈基类template <typename T>class Stack{public:virtual void push(const T&) = 0;virtual void pop() = 0;virtual int size() const = 0;virtual bool empty() const = 0;virtual T top() = 0;};// 链栈template <typename T>class linkStack :public Stack<T>{private:ChainNode<T>* topStack;int stackSize;public:string name;linkStack(const char *str=""):name(const_cast<char*>(str)){stackSize = 0;topStack = NULL;}~linkStack(){while (topStack != NULL){ChainNode<T>* tmp = topStack;topStack = topStack->next;delete[] tmp;}}bool empty() const{if (stackSize <= 0) return 1;return 0;}int size()const{ return stackSize; }void ShowAll(){while (!empty()){cout << topStack->elem << ' ';pop();}cout << endl;}void push(const T& data){ChainNode<T>* newNode = new ChainNode<T>;newNode->elem = data;newNode->next = topStack;topStack = newNode;stackSize++;}void pop(){if (stackSize <= 0){throw MyException("Stack empty!");}ChainNode<T>* tmp = topStack;topStack = topStack->next;delete[] tmp;stackSize--;}T top(){if (stackSize <= 0){throw MyException("Stack empty!");}return topStack->elem;}};template <typename T>void Hanio(int n,linkStack<T> &poleX, linkStack<T> &poleY, linkStack<T> &poleZ){if (n == 1){poleZ.push(poleX.top());poleX.pop();cout << poleX.name << "-->"<<poleZ.name << endl;}else{Hanio(n-1,poleX, poleZ, poleY);poleZ.push(poleX.top());poleX.pop();cout << poleX.name << "-->"<<poleZ.name << endl;Hanio(n-1,poleY, poleX, poleZ);}}int _tmain(int argc, _TCHAR* argv[]){linkStack<int> StackA("A"),StackB("B"),StackC("C");for (int i =4; i > 0; i--) StackA.push(i);Hanio(StackA.size(),StackA, StackB, StackC);StackC.ShowAll();return 0;}
<img src="http://img.blog.csdn.net/20160620222619536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


0 0