栈的链式实现
////////////////////////////////////////////////////////////////////////// // 栈的链式实现 // 2011-5-2 by kida#163.com // template <typename T> class Stack { public: typedef T value_type; typedef value_type& reference; typedef const value_type& const_reference; private: // 链栈的节点数据结构 typedef struct Node { value_type key; Node* next; }Node; private: Node* top; // 栈顶指针 public: Stack() : top(NULL) {} ~Stack() { try { SetEmpty(); } catch(...) { // do nothing } } public: // 入栈 void Push(const_reference x) throw(char*) { Node* p = new Node; if ( !p ) { throw "allocate memery failure"; } p->key = x; // 插入链栈头部 p->next = top; top = p; } // 出栈 value_type Pop() throw(char*) { if ( IsEmpty() ) { throw "stack is empty"; } // 存储栈顶节点的值 value_type tmp = top->key; // 移除栈顶节点 Node* p = top; top = top->next; delete p; return tmp; } // 清空栈 void SetEmpty() { Node* p = NULL; while (top) { Node* p = top; top = top->next; delete p; } } // 是否栈为空 bool IsEmpty() const { return !top; } };
优点:没有最大元素个数容量限制。
缺点:和顺序栈相比,链栈的入栈和出栈操作,涉及到存储空间的申请和释放,效率比顺序栈慢。
综合比较:对于频繁存取同时容量比较固定的情况下,请用顺序栈,Windows系统中,每个程序都对应一个栈空间,该栈空间就是顺序栈,其大小是固定的。
而对于低峰元素个数和高峰元素个数差异很大的情况,请用链栈。