#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="https://img-blog.csdn.net/20160620222619536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />