同样是一个小作业,只做了一部分,有待完善
#ifndef QUEUE_H
#define QUEUE_H
///
#include<iostream>
//声明一个Queue模板类
template <class T> class Queue;
//定义一个节点类
template <class T>
class qItem
{
friend class Queue<T>;
qItem(const T &t):item(t),next(0){} //构造函数
T item;//存储数据
qItem *next;//指向下一个节点
};
//Queue类的定义
template<class T>class Queue
{
public:
Queue():head(0),tail(0),length(0){}//默认构造函数
Queue(const Queue& temp):head(0),tail(0),length(0)
{copy(temp);} //复制构造函数
Queue& operator=(const Queue&);
~Queue(){destroy();} //析构函数
//访问队首
T front()
{
if(empty())
throw "front:空队!\n";
return head->item;
}
const T front()const
{
if(empty())
throw "front:空队!\n";
return head->item;
}
void push(const T&); //插入队尾
T pop(); //删除队首,返回值
int getLength(); //队列长度
bool empty()const{return head==0;}//判断队列是否为空
private:
qItem<T> *head; //指向队首
qItem<T> *tail; //指向队尾
void destroy(); //删除所有元素,永远析构函数
void copy(const Queue&); //复制所有元素
int length; //队列长度
};
//Queue类的实现
//删除所有元素
template<class T> void Queue<T>::destroy()
{
while(!empty())
pop();
}
//删除队首
template <class T>T Queue<T>::pop()
{
if(empty())
throw "空队!不能删除\n";
qItem<T> *temp=head;//指向队首
T val=front();
head=head->next;//指向后位
delete temp;//删除原队首
temp=NULL;
length--;
return val;
}
//入队
template<class T> void Queue<T>::push(const T&value)
{
qItem<T> *newItem=new qItem<T>(value);//创建一个新项
if(newItem==NULL)
throw "push:内存分配失败!\n";
//如果空队,直接放入
if(empty())
{
head=tail=newItem;
length++;
}
//非空则放入队尾
else
{
tail->next=newItem;
tail=newItem;
length++;
}
}
//复制元素
template<class T> void Queue<T>::copy(const Queue&old)
{
if(old.empty())
throw "copy:空队!不能复制\n";
qItem<T> *pt=old.head;
while(pt)
{
push(pt->item);
length++;
pt=pt->next;
}
}
//队列长度
template <class T> int Queue<T>::getLength()
{
return length;
}
#endif