栈的链式实现
//////////////////////////////////////////////////////////////////////////
// 栈的链式实现
// 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系统中,每个程序都对应一个栈空间,该栈空间就是顺序栈,其大小是固定的。
而对于低峰元素个数和高峰元素个数差异很大的情况,请用链栈。
浙公网安备 33010602011771号