65,210
社区成员
发帖
与我相关
我的任务
分享#ifndef _QUEUE_H_
#define _QUEUE_H_
template <typename Type> class Queue;
template <typename Type> std::ostream& operator<<(std::ostream&, const Queue<Type>&);
template <typename Type> class QueueItem {
friend class Queue<Type>;
friend std::ostream& operator<< <Type> (std::ostream&, const Queue<Type>&);
QueueItem(const Type &t): item(t), next(0) {}
Type item;
QueueItem *next;
};
template <typename Type> class Queue {
public:
friend std::ostream& operator<< <Type> (std::ostream&, const Queue<Type>&);
Queue(): head(0), tail(0) {}
template <typename It> Queue(It beg, It end): head(0), tail(0) {}
Queue(const Queue &q): head(0), tail(0)
{ copy_element(q); }
Queue& operator=(const Queue&);
~Queue() { destroy(); }
template <typename Iter> void assign(Iter, Iter);
Type& front() { return head->item; }
const Type& front() const { return head->item; }
Type& back() { return tail->item; }
void push(const Type &val);
void pop();
size_t length() const;
bool empty() const { return head == 0; }
private:
QueueItem<Type> *head;
QueueItem<Type> *tail;
void destroy();
void copy_element(const Queue&);
template <typename Iter> void copy_element(Iter, Iter);
};
template <typename Type> inline size_t Queue<Type>::length() const
{
size_t size = 0;
QueueItem<Type> *p = head;
while (p)
{
++size;
p = p->next;
}
return size;
}
template <typename Type>
Queue<Type>& Queue<Type>::operator=(const Queue &rhs)
{
if (this != &rhs) {
destroy();
copy_element(rhs);
}
return *this;
}
template <typename Type> void Queue<Type>::destroy()
{
while (!empty())
{
pop();
}
}
template <typename Type> void Queue<Type>::pop()
{
QueueItem<Type> *p = head;
head = head->next;
delete p;
}
template <typename Type> void Queue<Type>::push(const Type &val)
{
QueueItem<Type> *p = new QueueItem<Type>(val);
if (empty())
{
head = tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
template <typename Type>
template <typename Iter> void Queue<Type>::assign(Iter beg, Iter end)
{
destroy();
copy_element(beg, end);
}
template <typename Type>
void Queue<Type>::copy_element(const Queue<Type> &rhs)
{
for (QueueItem<Type> *pt = rhs.head; pt; pt = pt->next)
{
push(pt->item);
}
}
template <typename Type>
template <typename Iter> void Queue<Type>::copy_element(Iter beg, Iter end)
{
while (beg != end)
{
push(*beg);
++beg;
}
}
template <typename T> std::ostream& operator<<(std::ostream &os, const Queue<T> &q)
{
os << " < ";
QueueItem<T> *pqi;
for (pqi= q.head; pqi; pqi = pqi->next)
{
os << pqi->item << " ";
}
os << " > ";
os << " length: " << q.length() << std::endl;
return os;
}
#endif