//stack.h
#include <iostream>
using namespace std;
template <typename T>
class StackElement
{
public:
const T element;
const StackElement<T>*next;
StackElement(const T& x,const StackElement<T>* n=NULL):element(x),next(n){}
~StackElement()
{
cout << "haha!" << endl;
}
};
template <typename T>
class Stack
{
public:
Stack():tmp(NULL),Top(NULL){}
~Stack(){MakeEmpty();}
bool IsEmpty()const;
void MakeEmpty();
void Push(const T& x);
const T Pop();
const T& _Top();
private:
const StackElement<T>* tmp;
const StackElement<T>* Top;
};
template <typename T>
bool Stack<T>::IsEmpty()const
{
return Top==NULL;
}
template <typename T>
void Stack<T>::MakeEmpty()
{
if(Top!=NULL)
{
tmp=Top;
Top=tmp->next;
delete tmp;
}
}
template <typename T>
void Stack<T>::Push(const T& x)
{
tmp=new StackElement<T>(x,Top);
Top=tmp;
tmp=NULL;
}
template <typename T>
const T Stack<T>:: Pop()
{
tmp=Top;
Top=tmp->next;
T x=tmp->element;
delete tmp;
return x;
}
template <typename T>
const T& Stack<T>:: _Top()
{
return Top->element;
}
//test.cpp
#include "stack.h"
int main()
{
<span style="white-space:pre"> </span>Stack<int> IntStack;
<span style="white-space:pre"> </span>Stack<double> DoubleStack;
<span style="white-space:pre"> </span>for(int i=1;i<=10;++i)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>IntStack.Push(i);
<span style="white-space:pre"> </span>DoubleStack.Push(i*1.1);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>for(int i=1;i<=5;++i)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>cout << IntStack.Pop() << endl;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>for(int i=1;i<=5;++i)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>cout << DoubleStack.Pop() << endl;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>while(cin.get()!='\n');
<span style="white-space:pre"> </span>return 0;
}