#ifndef LINKEDDEQUE_H
#define LINKEDDEQUE_H
#include <iostream>
#include <assert.h>
using namespace std;
template<class T>
struct LinkNode //链式队列节点类的定义
{
T data; //数据域
LinkNode<T> *link; //链指针域
LinkNode(LinkNode<T> *ptr = NULL) //仅初始化指针成员的构造函数
{
link = ptr;
}
LinkNode(const T &item,LinkNode<T> *ptr = NULL) //初始化数据与指针成员的构造函数
{
data = item;
link = ptr;
}
};
template<class T>
class LinkedDeque
{
public:
LinkedDeque():front(NULL),rear(NULL){}
~LinkedDeque()
{
MakeEmpty();
}
void MakeEmpty(); //置空队列
bool IsEmpty()const
{
return (front == NULL) ? true : false;
}
bool GetHead(T& x)const;
bool GetTail(T& x)const;
bool EnQueue(const T& x);
bool EnQueueHead(const T& x);
bool EnQueueTail(const T& x);
bool DeQueue(T &x);
bool DeQueueHead(T &x);
bool DeQueueTail(T &x);
private:
LinkNode<T> *front,*rear; //队头、队尾指针
};
template<class T>
void LinkedDeque<T>::MakeEmpty()
{
LinkNode<T> *p;
while(front != NULL)
{
p = front;
front = front->link;
delete p;
}
}
template<class T>
bool LinkedDeque<T>::GetHead(T &x) const
{
if(IsEmpty() == true)
return false;
x = front->data;
return true;
}
template<class T>
bool LinkedDeque<T>::EnQueueTail(const T &x)
{
return EnQueue(x);
}
template<class T>
bool LinkedDeque<T>::DeQueueHead(T &x)
{
T temp;
bool tag = LinkedDeque<T>::DeQueue(temp);
x = temp;
return tag;
}
template<class T>
bool LinkedDeque<T>::GetTail(T& x)const
{
if(IsEmpty() == true)
return false;
x = rear->data;
return true;
}
template<class T>
bool LinkedDeque<T>::EnQueueHead(const T &x)
{
LinkNode<T> *p = new LinkNode<T>(x);
if(p == NULL)
return false;
p->link = front;
front = p;
return true;
}
template<class T>
bool LinkedDeque<T>::DeQueueTail(T &x)
{
if(IsEmpty() == true)
return false;
LinkNode<T> *p = front;
while(p->link != rear)
p = p->link;
x = rear->data;
delete rear;
p->link = NULL;
rear = p;
return true;
}
#endif