类声明 #ifndef STACK_H #define STACK_H //前向声明栈节点 struct _StackNode; typedef struct _StackNode StackNode; enum _Status; typedef enum _Status Status; typedef int (*FuncVisit)(void* ctx,void* data); //栈类 class CStack { private: StackNode* m_top;//栈顶指针 size_t m_length;//当前已有节点数量 StackNode* Create_Node(void* _data);//创建一个栈节点 Status Terminate_Node(StackNode* _node);//销毁一个栈节点 public: CStack();//构造一个空栈 Status Clear(void);//把栈置空 Status Empty(void);//判断是否为空栈 size_t Length(void);//给节点数量 Status Push(void* _data);//入栈 Status Pop(void** _data);//出栈 Status GetTop(void** _data);//给栈顶元素 Status Traverse(FuncVisit _pFuncVisit,void* _ctx);//遍历所有节点 ~CStack();//销毁栈 }; #endif 类的实现 #include "Stack.h" #include <iostream> using namespace std; //声明栈节点 struct _StackNode { void* data; _StackNode* next; }; //返回状态标志 enum _Status { OK=0,ERROR=-1 }; //创建一个栈节点 StackNode* CStack::Create_Node(void* _data) { StackNode* node = new StackNode; node->data = _data; node->next = NULL; m_length++; return node; } //销毁一个栈节点 Status CStack::Terminate_Node(StackNode* _node) { if (_node != NULL && m_top != NULL) { delete _node; m_length--; return OK; } return ERROR; } //构造一个空栈 CStack::CStack() { m_top = NULL; m_length = 0; } //把栈置空 Status CStack::Clear(void) { StackNode* cursor = NULL; while(m_top != NULL && m_length != 0) { //从栈顶开始往下清空 cursor = m_top; m_top = m_top->next; Terminate_Node(cursor); } m_top = m_top = NULL; return OK; } //判断是否为空栈 Status CStack::Empty(void) { if (NULL == m_top) { return OK; } return ERROR; } //给节点数量 size_t CStack::Length(void) { return m_length; } //入栈 Status CStack::Push(void* _data) { StackNode* node = Create_Node(_data); if (node != NULL) { node->next = m_top; m_top = node; return OK; } return ERROR; } //出栈 Status CStack::Pop(void** _data) { if (m_top != NULL) { if(_data != NULL)*_data = m_top->data; StackNode* node = m_top; m_top = m_top->next; Terminate_Node(node); return OK; } return ERROR; } //给栈顶元素 Status CStack::GetTop(void** _data) { if (m_top != NULL) { *_data = m_top->data; return OK; } return ERROR; } //遍历所有节点 Status CStack::Traverse(FuncVisit _pFuncVisit,void* _ctx) { if (m_top != NULL) { StackNode* cursor = m_top; while(cursor!=NULL) { _pFuncVisit(_ctx,cursor->data); cursor = cursor->next; } return OK; } return ERROR; } //销毁栈 CStack::~CStack() { StackNode* cursor = NULL; while(m_top != NULL && m_length != 0) { //从栈顶开始往下销毁 cursor = m_top; m_top = m_top->next; Terminate_Node(cursor); } m_top = NULL; }