/* * lqueue.cpp * * Created on: 11.11.2014 г. * Author: trifon */ #include #include "queue.h" template struct QueueElement { QueueElement(T const& d = T(), QueueElement* n = NULL) : data(d), next(n) {} T data; QueueElement* next; }; template class LQueue : public Queue { private: QueueElement *front, *back; int size; void copy(LQueue const&); void clean(); public: LQueue(); LQueue(LQueue const&); LQueue& operator=(LQueue const&); ~LQueue(); bool empty() const; bool push(T const&); T pop(); bool pop(T&); T head() const; bool head(T&) const; int length() const { return size; } }; template LQueue::LQueue() : front(NULL), back(NULL), size(0) {} template bool LQueue::empty() const { return front == NULL; // return back == NULL; // return size == 0; } template bool LQueue::push(T const& x) { QueueElement* p = new QueueElement(x); if (!p) return false; if (empty()) front = p; else back->next = p; back = p; size++; return true; } template bool LQueue::pop(T& x) { if (!head(x)) return false; QueueElement* p = front; front = front->next; if (front == NULL) back = NULL; delete p; size--; return true; } template T LQueue::pop() { T x; pop(x); return x; } template bool LQueue::head(T& x) const { if (empty()) return false; x = front->data; return true; } template T LQueue::head() const { T x; head(x); return x; } template void LQueue::copy(LQueue const& q) { QueueElement* toCopy = q.front; /* while (toCopy != NULL) { push(toCopy->data); toCopy = toCopy->next; } */ for(QueueElement* toCopy = q.front; toCopy; toCopy = toCopy->next) push(toCopy->data); } template void LQueue::clean() { T x; while (pop(x)); // за домашно: директна реализация } template LQueue::LQueue(LQueue const& q) : front(NULL), back(NULL) { copy(q); } template LQueue& LQueue::operator=(LQueue const& q) { if (&q != this) { clean(); copy(q); } return *this; } template LQueue::~LQueue() { clean(); }