직접 작성 한 데이터 구조: Queue 류 템 플 릿 의 링크 구현

#include "MyStack.h" //  stack      

template 
class MyQueue
{
public:
	MyQueue():_front(0), _back(0), size(0) {}
	MyQueue(const MyQueue& q);
	MyQueue& operator = (const MyQueue& q);
	bool operator == (const MyQueue& q);
	bool operator += (const MyQueue& q);
	~MyQueue();
	T& front();
	T& back();
	void push(const T& t);
	void pop();
	bool empty() const;
	void clear();
protected:
private:
	class Node
	{
	public:
		Node(const T& t, Node* n = 0):val(t), next(n){}
		T val;
		Node* next;		
	};
	Node* _front, *_back;
	size_t size;
};

template  MyQueue::MyQueue(const MyQueue& q):_back(0), size(q.size)
{
	if (size == 0) return;
	for (Node* cur = q._front; cur; cur = cur->next)
	{
		if (cur == q._front)
			_front = _back = new Node(cur->val);
		else
			_back = _back->next = new Node(cur->val);
	}
}

template  MyQueue::~MyQueue()
{
	while (!empty())
	         pop();
}

template  T& MyQueue::front()
{
	return _front->val;
}

template  T& MyQueue::back()
{
	return _back->val;
}

template  void MyQueue::push(const T& t)
{
	if (size == 0)
		_front = _back = new Node(t);
	else
		_back = _back->next = new Node(t);
	++size;
}

template  void MyQueue::pop()
{
	if (size > 0)
	{
		Node* temp = _front;
		_front = _front->next;
		delete temp;
		--size;
	}
}

template  bool MyQueue::empty() const
{
	return size == 0;
}

template  void MyQueue::clear()
{
	while (!empty())
		pop();
}

template  MyQueue& MyQueue::operator = (const MyQueue& q)
{
	if (q.size == size)
	{
		Node* temp(this->_back);
		for (Node* cur = q._back; cur != q._front; cur = cur->next)
		{
			temp->val = cur->val;
			temp = temp->next;
		}
	}
}
//           
template  bool MyQueue::operator == (const MyQueue& q)
{
	MyQueue q1(q);
	MyQueue this2(*this);
	if (q.size == size)
	{
		while (!q1.empty())
		{
			if (q1.front() != this2.front())
			{
				return false;
			}
			q1.pop();
			this2.pop();
		}
		return true;
	}
	else
		return false;
}
//         
template  bool MyQueue::operator += (const MyQueue& q)
{
	if (q.size > 0)
	{
		MyQueue q2(q);
		while (!q2.empty())
		{
			push(q2.front());
			q2.pop();
		}
		return true;
	}
	return false;
}
//        (  stack   )
template  void reverse(MyQueue& q)
{
	MyStack s;
	while (!q.empty())
	{
		s._push(q.front());
		q.pop();
	}
	while (!s._empty())
	{
		q.push(s._top());
		s._pop();
	}
}

좋은 웹페이지 즐겨찾기