模板类、模板函数与重载
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
template <class T> class Queue;
template <class Type>
std::ostream &operator << (std::ostream &os,const Queue<Type> & q)
{
os << "< ";
QueueItem<Type> *p;
for(p=q.front;p;p=p->next)
os << *p << " ";
os<<">";
return os;
}
template <class Type>
std::ostream &operator <<(std::ostream &os,const QueueItem<Type> & qi)
{
os << qi.item;
return os;
}
template <class T>
class QueueItem
{
friend class Queue<T>;
friend std::ostream &operator << <T> (std::ostream &os,const QueueItem<T> & qi);
public:
QueueItem(const T &a):item(a),next(NULL){}
private:
T item;
QueueItem *next;
};
template <class Type>
class Queue
{
friend std::ostream &operator << <Type> (std::ostream &,const Queue<Type> & );
public:
Queue();
~Queue();
Type remove();
void add(const Type &);
bool is_empty() const
{
return front==0;
}
private:
QueueItem <Type> *front;
QueueItem <Type> *back;
};
//实现部分
//using namespace std;
template <class Type>
inline Queue<Type>::Queue()
{front=back=0;}
template <class Type>
Queue<Type>::~Queue()
{
while (!is_empty())
{
remove();
}
}
template <class T>
T Queue<T>::remove()
{
if (is_empty())
{
cerr << "remove() on empty queue\n";
exit(-1);
}
QueueItem<T> *pt=front;
front=front->next;
T retval=pt->item;
delete pt;
return retval;
}
template <class T>
void Queue<T>::add(const T &val)
{
QueueItem<T> *pt=new QueueItem<T>(val);
if (is_empty())
{
front=back=pt;
}
else
{
back->next=pt;
back=pt;
}
}
#endif