64,654
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <iostream>
using namespace std;
template<typename T>
class Queue;
template<typename T>
ostream &operator<<(ostream &,const Queue<T>&);
template<typename T>
class QueueItem;
template<typename T>
ostream &operator<<(ostream& os, const QueueItem<T>& item)
{
os<<"<";
os<<item.item;
os<<">";
return os;
}
template<typename T>
class QueueItem
{
public:
friend ostream &operator<< <T>(ostream &,const QueueItem<T>&);
friend class Queue<T>;
QueueItem(const T &t):item(t),next(0){}
QueueItem *next;
T item;
};
template<typename T>
class Queue
{
friend ostream &operator<< <T>(ostream &,const Queue<T>&);
public:
Queue(const Queue &);
Queue():head(0),tail(0){}
~Queue();
void push(T const &);
bool empty();
void pop();
const T &front()const;
T &front();
Queue &operator=(const Queue &);
private:
QueueItem<T> *head;
QueueItem<T> *tail;
};
template<typename T>
Queue<T>::Queue(const Queue &Q):head(0),tail(0)
{
for(QueueItem<T> *ptr=Q.head;ptr;ptr=ptr->next)
push(ptr->item);
}
template<typename T>
Queue<T>::~Queue()
{
while(!empty())
pop();
}
template<typename T>
void Queue<T>::push(T const &t)
{
QueueItem<T> *pt=new QueueItem<T>(t);
if(empty())
head=tail=pt;
else
{
tail->next=pt;
tail=pt;
}
}
template<typename T>
bool Queue<T>::empty()
{
if(head==tail)
return true;
return false;
}
template<typename T>
void Queue<T>::pop()
{
QueueItem<T> *ptr=head;
head=head->next;
delete ptr;
}
template<typename T>
T const &Queue<T>::front()const
{return head->item;}
template<typename T>
T &Queue<T>::front()
{return head->item;}
template<typename T>
Queue<T> &Queue<T>::operator=(const Queue & QU)
{
while(!empty())
pop();
for(QueueItem<T> *ptr=QU.head;ptr;ptr=ptr->next)
push(ptr->item);
return *this;
}
template<>
class Queue<char const *>
{
public:
bool empty(){return real_queue.empty(); }
void pop(){real_queue.pop();}
string &front(){return real_queue.front();}
string const &front()const{return real_queue.front();}
void push(char const *);
private:
Queue<string> real_queue;
};
void Queue<char const *>::push(const char *ch)
{
real_queue.push(ch);
}
template<typename T>
ostream &operator<<(ostream &os,const Queue<T> &Q)
{
os<<"<";
for(QueueItem<T> *q=Q.head;q;q=q->next)
os<<q->item<<" ";
os<<">";
return os;
}
int main(void)
{
Queue<int> queue1;
queue1.push(2);
queue1.push(23);
cout<<queue1;
return 0;
}