堆栈比较完美的版本实现,平常可以自己开堆栈使用。目前的一个任务情况是通过逆波兰法解析数学表达式而用到堆栈。
/*
============================================================================
Name : CStack
Author : Swair Fang
Version : 5.1
CopyRight : by Swair Fang
Description : CStack Achieving, Ansi-style
Function:
1.Push
2.Pop
3.Top
4.Print
Example:
CStack Stack;
T X;
Stack.Push(X);
Stack.Pop(&X);
Stack.Top();
Stack.Print();
============================================================================
*/
#ifndef _CStack_H
#define _CStack_H
#include
#include
#include
using namespace std;
template
class CStack
{
typedef struct CNode
{
T m_Elt;
struct CNode *pNext;
};
private:
struct CNode *m_pStack;
int m_iSize;
struct CNode *m_pNode;
public:
CStack();
~CStack();
int GetSize();
void operator=(CStack &Right);
void Push(T X);
void Pop(T &m_pPX);
void Top(T &m_pPX);
void MakeEmpty();
void Print();
void Empty();
};
template
CStack
::CStack() { printf("Create CStack\n"); m_pStack=new CNode; if(m_pStack==NULL) printf("Out of space!!!"); m_pStack->pNext=NULL; m_iSize=0; } template
CStack
::~CStack() { printf("Destroy CStack\n"); CNode *Tmp; m_pNode=m_pStack->pNext; m_pStack->pNext=NULL; while(m_pNode!=NULL) { Tmp=m_pNode->pNext; delete m_pNode; m_pNode=Tmp; } delete m_pStack; } template
int CStack
::GetSize() { return m_iSize; } template
void CStack
::Empty() { printf("Empty CStack\n"); CNode *Tmp; m_pNode=m_pStack->pNext; m_pStack->pNext=NULL; while(m_pNode!=NULL) { Tmp=m_pNode->pNext; delete m_pNode; m_pNode=Tmp; } m_iSize=0; } template
void CStack
::operator=(CStack &Right) { printf("call assignment\n"); Empty(); m_pNode=m_pStack; Right.m_pNode=Right.m_pStack->pNext; while(Right.P!=NULL) { struct CNode *Tmp=new CNode; Tmp->m_Elt=Right.P->m_Elt; Tmp->pNext=NULL; m_pNode->pNext=Tmp; m_pNode=m_pNode->pNext; Right.m_pNode=Right.m_pNode->pNext; } m_iSize=Right.m_iSize; } template
void CStack
::Push(T X) { m_pNode=new CNode; if(m_pNode==NULL) { printf("Out of space!!!"); exit(1); } m_pNode->m_Elt=X; m_pNode->pNext=m_pStack->pNext; m_pStack->pNext=m_pNode; m_iSize++; } template
void CStack
::Pop(T &pX) { if(m_pStack->pNext==NULL) printf("Empty CStack"); else { m_pNode=m_pStack->pNext; m_pStack->pNext=m_pStack->pNext->pNext; T X=m_pNode->m_Elt; free(m_pNode); pX=X; m_iSize--; } } template
void CStack
::Top(T &pX) { if(m_pStack==NULL||m_pStack->pNext==NULL) printf("Empty CStack"); else { pX=m_pStack->pNext->m_Elt; } } template
void CStack
::Print() { if(m_pStack->pNext==NULL) printf("CStack is Empty\n"); else { m_pNode=m_pStack->pNext; while(m_pNode!=NULL) { char *cp=(char*)m_pNode; printf("0x%x:",cp); cout<
m_Elt<
pNext; } printf("m_iSize:%d\n\n",m_iSize); } } #endif int main() { CStack
Stack; Stack.Push(3.324); Stack.Print(); CStack
stack; stack.Push("hello,unistar"); stack.Print(); char* c; stack.Pop(c); cout<
<