最近的确很忙,就贴少一点了.今天我们就看看一个简单的堆栈吧.
#ifndef _STACK_H_
#define _STACK_H_
template <typename T>
class CStack;
template <typename T>
struct Elem
{
friend CStack<T>;
private:
T elem;
Elem<T> * pNext;
public:
Elem():pNext(NULL){};
Elem( T e ):elem(e),pNext(NULL){};
};
template <typename T>
class CStack
{
public:
CStack():m_nLen(0),m_pHead(NULL){};
virtual ~CStack();
public:
/*----------------------------*/
失败返回-1,否则返回栈深度
/*----------------------------*/
int Push( T e );
int Pop( T & e );
int DestroyStack();
bool IsEmpty();
private:
private:
Elem<T> * m_pHead;
int m_nLen;
};
template <typename T>
CStack<T>::~CStack()
{
DestroyStack();
m_nLen = 0;
m_pHead = NULL;
}
template <typename T>
int CStack<T>::Push( T e )
{
Elem<T> *pElem = NULL;
pElem = new Elem<T>(e);
pElem ->pNext = m_pHead;
m_pHead = pElem;
m_nLen++;
return m_nLen;
}
template <typename T>
int CStack<T>::Pop( T & e )
{
if ( IsEmpty() ) return -1;
e = m_pHead ->elem;
m_pHead = m_pHead ->pNext;
m_nLen--;
return m_nLen;
}
template <typename T>
int CStack<T>::DestroyStack()
{
if ( IsEmpty() ) return 0;
Elem<T> *p,*q;
p = q = NULL;
p = m_pHead;
while ( p )
{
q = p;
p = p ->pNext;
delete q;
}
m_pHead = NULL;
m_nLen = 0;
return m_nLen;
}
template <typename T>
bool CStack<T>::IsEmpty()
{
return m_pHead == NULL;
}
#endif//_STACK_H_
好了,搞定了!