不废话,上代码
//head.h
#ifndef HEAD
#define HEAD
#include<iostream>
using namespace std;
template<typename T> class LinkStack;
template <typename T>
class LinkNode
{
public:
friend class LinkStack<T>;
LinkNode();
LinkNode( const T &elem);
//~LinkNode();用不到
private:
T data;
LinkNode<T> *pPre;
LinkNode<T> *pNext;
};
template <typename T>
LinkNode<T>::LinkNode():pPre(NULL),pNext(NULL)
{
//用于初始化头结点,data用不到。
}
template <typename T>
LinkNode<T>::LinkNode( const T &elem):data(elem),pPre(NULL),pNext(NULL)
{
//初始化其余元素
}
#endif
//lstack.cpp
#include "head.h"
template<typename T>
class LinkStack
{
public:
LinkStack();
~LinkStack();
bool IsEmpty();
void Push(const T &data);
T Pop();
T GetTop();
int GetSize();
void Clear();
private:
LinkNode<T> *Top;
LinkNode<T> *Base;
int Size;
};
template<typename T>
LinkStack<T>::LinkStack():Size( 0 )
{
Top = new LinkNode<T>;
Base = Top;
}
template<typename T>
LinkStack<T>::~LinkStack()
{
if( ! IsEmpty() ){
Clear();
}
delete Base;
}
template<typename T>
bool LinkStack<T>::IsEmpty()
{
if( Size == 0 ){
return true;
}else{
return false;
}
}
template<typename T>
int LinkStack<T>::GetSize()
{
return Size;
}
template<typename T>
T LinkStack<T>::GetTop()
{
return Top->data;
}
template<typename T>
void LinkStack<T>::Push( const T &data)
{
LinkNode<T> *p;
p = new LinkNode<T>;
p->pPre = Top;
p->data = data;
Top = p;
++Size;
}
template<typename T>
T LinkStack<T>::Pop()
{
LinkNode<T> *q;
q = Top;
T data;
Top = q->pPre;
data = q->data;
delete q;
--Size;
return data;
}
template<typename T>
void LinkStack<T>::Clear()
{ LinkNode<T> *p;
while( Top != Base ){
p = Top;
Top = p->pPre;
delete p;
--Size;
}
}
//main.cpp 测试
#include "head.h"
#include "lstack.cpp"
int main()
{
LinkStack<int> ls;
cout<< ls.GetSize()<<endl;
ls.Push( 66);
ls.Push( 55);
ls.Push( 44);
ls.Push( 33);
ls.Push( 22);
cout<< ls.GetSize()<<endl;
cout<< ls.Pop()<<endl;
ls.Clear();
cout<< ls.GetSize()<<endl;
}