#include
#include
using namespace std;
template
struct Node
{
T item;
Node *next;
Node *prew;
};
template
class LQueue
{
private:
Node *head;
Node *rear;
int Count;
public:
LQueue();
~LQueue();
void enqueue(T item);//入队
void dequeue();//出队
int size(){ return Count; }//获取队列当前元素个数
bool isempty(){ return Count == 0 ? true : false; }//判断队列是否为空
T getHead();//获取队头的元素
};
template
LQueue::LQueue()
{
Count=0;
Node *anode=new Node;
anode->next=NULL;
anode->prew=NULL;
head=anode;
rear=anode;
}
template
LQueue::~LQueue()
{
for (int i = 0; i < Count; i++)
dequeue();
}
template
void LQueue::enqueue(T item)
{
if(Count==0)
{
rear->item=item;
Count++;
}
else
{
Node anode=new Node; //new申请的空间是在"堆"上的,堆上的空间,必须由程序员用delete释放,否则就会造成“内存泄露”。也就是说这部分内存一直被程序占有。
anode->item = item;
anode->next=rear;
rear->prew=anode;
rear=anode;
rear->prew=NULL;
Count++;
}
}
template
void LQueue::dequeue()
{
if(isempty())
{
cout<<“This LQueue is empty now”<<endl;
}
else
{
Node *p=head;
head=p->prew;
delete p;
Count–;
}
}
template
T LQueue::getHead()
{
return head->item;
}
//因为出站时是从head开始出站,所以对head后的每个Node,它的next的方向指向先出站的Node,prew的方向指向后出站的Node。
在理解时,这个队列的next和prew互换才符合正常思维。