#include <iostream>
using namespace std;

template <class T>
class LinkNode {
	template <class T>
	friend class LinkStack;

public:
	LinkNode() {
		next = NULL;
	}

private:
	T data;
	LinkNode<T>* next;
};

template <class T>
class LinkStack {
public:
	LinkStack();
	~LinkStack();
	
	bool IsEmpty() const;//判空
	bool Push(const T& x);//入栈
	bool Top(T& x);//取栈顶值
	bool Pop(T& x);//出栈
	void outPut(ostream& out) const;//输出

private:
	LinkNode<T>* top;//栈顶结点
	int size;//栈中元素个数
};

template<class T>
LinkStack<T>::LinkStack()
{
	top = NULL;
	size = 0;
}

template<class T>
LinkStack<T>::~LinkStack()
{
	T x;
	while (top != NULL)
		Pop(x);
}

template<class T>
bool LinkStack<T>::IsEmpty() const
{
	return top==NULL;
}

template<class T>
bool LinkStack<T>::Push(const T& x)
{
	LinkNode<T>* p = new LinkNode<T>;
	if (p == NULL)
		return false;
	else {
		p->data = x;
		p->next = top;
		top = p;

		size++;
		return true;
	}
}

template<class T>
bool LinkStack<T>::Top(T& x)
{
	LinkNode<T>* p = new LinkNode<T>;
	if (p == NULL)
		return false;
	else {
		x = top->data;
		return true;
	}
}

template<class T>
bool LinkStack<T>::Pop(T& x)
{
	LinkNode<T>* p = new LinkNode<T>;
	if (p == NULL)
		return false;
	else {
		x = top->data;
		p = top;//将p指向待删除结点
		top = top->next;//top指向新的栈顶结点
		delete p;
		
		size--;
		return true;
	}
}

template<class T>
void LinkStack<T>::outPut(ostream& out) const
{
	LinkNode<T> *p;
	p = top;
	for (int i = 0; i < size; i++) {
		out << p->data << endl;
		p = p->next;
	}
}
template <class T>
ostream& operator<<(ostream& out, const LinkStack<T>& x) {
	x.outPut(out);
	return out;
}

int main() {
	LinkStack<int> s;



	return 0;
}
点击阅读全文
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐