#include "MyStack.h" //包含stack模板类头文件
template <class T>
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 <class T> MyQueue<T>::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 <class T> MyQueue<T>::~MyQueue()
{
while (!empty())
pop();
}
template <class T> T& MyQueue<T>::front()
{
return _front->val;
}
template <class T> T& MyQueue<T>::back()
{
return _back->val;
}
template <class T> void MyQueue<T>::push(const T& t)
{
if (size == 0)
_front = _back = new Node(t);
else
_back = _back->next = new Node(t);
++size;
}
template <class T> void MyQueue<T>::pop()
{
if (size > 0)
{
Node* temp = _front;
_front = _front->next;
delete temp;
--size;
}
}
template <class T> bool MyQueue<T>::empty() const
{
return size == 0;
}
template <class T> void MyQueue<T>::clear()
{
while (!empty())
pop();
}
template <class T> MyQueue<T>& MyQueue<T>::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 <class T> bool MyQueue<T>::operator == (const MyQueue& q)
{
MyQueue<T> q1(q);
MyQueue<T> 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 <class T> bool MyQueue<T>::operator += (const MyQueue& q)
{
if (q.size > 0)
{
MyQueue<T> q2(q);
while (!q2.empty())
{
push(q2.front());
q2.pop();
}
return true;
}
return false;
}
//实现队列元素反转(用到stack模板类)
template <class T> void reverse(MyQueue<T>& q)
{
MyStack<T> s;
while (!q.empty())
{
s._push(q.front());
q.pop();
}
while (!s._empty())
{
q.push(s._top());
s._pop();
}
}