template <class T>
class Queue
{
public:
Queue();
Queue(const Queue&);
~Queue();
Queue& operator=(const Queue&);
int size() const;
bool empty() const;
T& front();
T& back();
void push(const T&);
void pop();
void dispValues();
protected:
class Node
{
public:
Node(const T& x, Node* next=0) : _(x), _next(next) {}
T _;
Node* _next;
};
Node *_front, _back;
int _size;
};

template <class T> Queue<T>::Queue() : _back(0), _size(0)
{
}

template <class T>
Queue<T>::Queue(const Queue& s) : _back(0), _size(s._size)
{
if (_size==0) return;
Node* pp=0;
for (Node* p = s._back; p; p = p->_next)
if (p==s._back) pp = _back = new Node(p->_);
else pp = pp->_next = new Node(p->_);
}

template <class T> Queue<T>::~Queue()
{
while (_back)
{
Node* p=_back;
_back = _back->_next;
delete p;
}
}

template <class T> int Queue<T>::size() const
{
return _size;
}

template <class T> bool Queue<T>::empty() const
{
return _size==0;
}

template <class T> T& Queue<T>::front()
{
return _front->_;
}

template <class T> T& Queue<T>::back()
{
return _back->_;
}

template <class T> void Queue<T>:ush(const T& x)
{
if (_size==0) _front = _back = new Node(x);
else _back = _back->_next = new Node(x);
++_size;
}

template <class T> void Queue<T>:op()
{
Node* p = _front;
_front = _front->_next;
delete p;
--_size;
}


template <class T>
void Queue<T>:: dispValues()
{
cout << "front = " << _front << endl;
cout << "back = " << _back << endl;
cout << "size = " << _size << endl;
for ( Node* p = _front; p; p = p->_next)
cout << p->_ << endl;
}

template <class T>
void print(const Queue<T> &ss)
{
Queue<T> s = ss;
cout << "size = " << s.size();
if (s.size() > 0)
{
cout << ", back=" << s.back() << ": (" << s.front();
s.pop();

while (!s.empty())
{
cout << "," << s.front();
s.pop();
}
cout << ")";

}
cout << endl;
}

void main()
{
Queue<string> s; print(s);
s.push("first"); print(s);
s.push("second"); print(s);
s.push("third"); print(s);
s.pop(); print(s);
s.push("fourth"); print(s);
s.push("fifth"); print(s);
s.push("sixth"); print(s);
s.pop(); print(s);
// s.dispValues();
}


//need help with debuggin this file