链式队列和数组队列有些不同,链式队列的队尾指针是指向最后一元素位置,而数组队列是指向最后一个元素的下一个位置。链式队列可以充分应用存储空间,不会存在浪费的情况。
template<class T>
struct LinkNode{
T data;
LinkNode<T> *link;
LinkNode(T&x, LinkNode<T>*p=NULL):data(x),link(p){}
};
template<class T>
class LinkQueue{
public:
LinkQueue():rear(NULL), Front(NULL){}
~LinkQueue(){makeEmpty();}
bool EnQueue(const T&x);
bool DeQueue(T&x);
bool getFront(T&x)const;
void makeEmpty();
bool IsEmpty()const{return (Front==NULL)?true:false;}
int getSize()const;
friend ostream& operator<<(ostream& os, LinkQueue<T>& Q);
private:
LinkNode<T> *Front, *rear;
};
template<class T>
void LinkQueue<T>::makeEmpty(){
LinkNode<T> *p;
while(Front!=NULL){
p=Front;
Front=Front->link;
delete p;
}
}
template<class T>
bool LinkQueue<T>::EnQueue(const T&x){
//将新元素x插入到队列的队尾
if(Front==NULL){//这里要考虑队列为空的情况,在这里要处理队尾和队头指针
Front=rear=new LinkNode<T>(x);
if(Front==NULL)return false;
}
else{//链式队列的队尾和数组式的不一样,数组式的是指向空位置,而链表式的指向末尾一个节点
rear->link=new LinkNode<T>(x);
if(rear->link==NULL)return false;
rear=rear->link;
}
return true;
}
template<class T>
bool LinkQueue<T>::DeQueue(T&x){
//如果队列不为空,将队头节点从链表中删除,若为空则直接退出
if(IsEmpty())return false;
LinkNode<T> *p;
p=Front;
x=p->data;
Front=Front->link;
delete p;
return true;
}
template<class T>
bool LinkQueue<T>::getFront(T&x)const{
if(IsEmpty())return false;
x=Front->data;
return true;
}
template<class T>
int LinkQueue<T>::getSize()const{
LinkNode<T> *p=Front;
int sum=0;
while(p!=NULL){
sum++;
p=p->link;
}
return sum;
}
template<class T>
ostream& operator<<(ostream& os, LinkQueue<T>& Q){
//输出队列中元素的重载操作<<
os<<"队列中元素个数有"<<Q.getSize()<<endl;
LinkQueue<T> *p=Q.Front;
int i=0;
while(p!=NULL){
os<<"第"<<++i<<"个元素为"<<p.data<<endl;
p=p->link;
}
return os;
}