栈的链式实现

//////////////////////////////////////////////////////////////////////////
// 栈的链式实现
// 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系统中,每个程序都对应一个栈空间,该栈空间就是顺序栈,其大小是固定的。
而对于低峰元素个数和高峰元素个数差异很大的情况,请用链栈。
原文地址:https://www.cnblogs.com/csuchao/p/2034532.html