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
- 汉诺塔解法(C/C++)
- (C#)汉诺塔
- 栈(C#)
- [C/C++]汉诺塔的实现
- C/C++:堆与栈
- [C/C++] 函数调用的栈分配
- 堆和栈的区别(C/C++)
- C++/C语言中链表队列与栈
- 【C/C++】堆和栈的区别
- 【C语言/C++】 栈和队列
- 【C/C++】堆和栈的区别
- 两个栈实现一个队列(C/C++)
- 数据结构(栈)c/c++/java实现
- C 简陋自动汉诺塔
- 汉诺塔C语言实现
- C++Practise12:汉诺塔问题
- C 语言 ---- 汉诺塔算法
- 汉诺塔(c语言实现)
- 2016职称计算机哪几门更容易通过?
- Sass语法
- Swift - 按钮(UIButton)的用法
- 持久化技术SharedPreferences存储
- 关于DNS域名服务器的总结
- C++ 栈-汉诺塔
- 软件测试实习0620
- Android学习之Drawelayout
- 自定义倒计时TimeButton
- 2016年全国职称计算机应用能力考试各省市报名入口
- TCP连接三次握手的通俗理解
- Android APP欢迎界面小试身手
- 观察者模式(Python实现)
- android6.0SDK 删除HttpClient的相关类的解决方法