C++通用链栈的实现(类模板)


template
class MyStack
{
private:
	struct StackNode
	{
		T data;
		StackNode* next;
		StackNode(const T& val=T(), StackNode* p = nullptr) :data(val), next(p)
		{

		}
	};
private:
	StackNode* top;
	int cursize;
	void clone(const MyStack& s)
	{
		cursize = s.cursize;
		StackNode* p = s.top;
		if (p == nullptr)
		{
			return;
		}
		
		StackNode* cp = new StackNode(p->data);
		StackNode* tile = top=cp;
		p = p->next;
		while (p != nullptr)
		{
			tile = tile->next = new StackNode(p->data);
			p = p->next;
		}
	}
public:
	MyStack():top(nullptr),cursize(0){}

	MyStack(const MyStack& s)
	{
		clone(s);
	}

	MyStack& operator=(const MyStack& s)
	{
		if (this != &s)
		{
			clone(s);
		}
		return*this;
	}

	void Clear()
	{
		while (top != nullptr)
		{
			StackNode* q = top;
			top = q->next;
			delete q;
		}
		cursize = 0;
	}
	~MyStack()
	{
		Clear();
	}
	const T& Top()const
	{
		return top->data;
	}

	void Pop()
	{
		StackNode* q = top;
		top = q->next;
		delete q;
		--cursize;
	}

	void Push(const T& val)
	{
		top = new StackNode(val, top);
		++cursize;
	}

	bool Empty()const
	{
		return cursize == 0;
	}
};
int main()
{
	MyStack mys;
	for (int i = 0; i < 3; ++i)
	{
		string s="";
		cin >> s;
		mys.Push(s);
	}
	MyStack ys(mys);
	MyStack hs;
	hs = ys;
	string val = "";
	while (!hs.Empty())
	{
		val = hs.Top();
		cout << val << endl;
		hs.Pop();
	}
	return 0;
}

为了提高代码的复用,拷贝构造和赋值运算符重载用了相同的代码,并且将其封装。

你可能感兴趣的:(c++,算法,开发语言)