#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;
namespace my_space
{
template<class ElemType>
class queue
{
public:
queue(); //初始化队列
~queue(); //销毁队列
int create_queue(int isize);//创建队列
bool empty() const; //判断队列是否为空
int length() const; //返回队列的长度
ElemType gethead() throw(out_of_range); //返回队列的队首元素
void push_back(const ElemType &e); //插入元素到队尾
ElemType *pop_front() throw(out_of_range); //删除队头元素
private:
class qnode
{
public:
ElemType data;
qnode *next;
};
qnode *front;
qnode* rear;
int size;
int queuelen;
};
template<class ElemType>
queue<ElemType>::queue() : size(0) ,queuelen(0)
{
front = rear = new qnode;
//front -> next = NULL;
front -> next = rear;
}
template<class ElemType>
queue<ElemType>::~queue()
{
#if 0
while(front)
{
rear = front -> next;
delete front;
front = rear;
}
#else
while (queuelen >= 0)
{
qnode *node = front->next;
delete front;
front = node;
--queuelen;
}
#endif
}
template<class ElemType>
int queue<ElemType>::create_queue(int isize)
{
if (isize <= 0 || size > 0)
{
return 0;
}
qnode *tmp = front;
int tmpsize = isize;
while (tmpsize > 0)
{
qnode *p = new qnode;
tmp->next = p;
tmp = p;
tmp->next = front;
tmpsize--;
queuelen++;
}
return isize;
}
template<class ElemType>
bool queue<ElemType>::empty() const
{
return size == 0;
}
template<class ElemType>
int queue<ElemType>::length() const
{
return size;
}
template<class ElemType>
ElemType queue<ElemType>::gethead() throw(out_of_range)
{
if(empty())
throw("queue is empty");
return front->next->data;
}
template<class ElemType>
void queue<ElemType>::push_back(const ElemType &e)
{
#if 0
qnode *p = new qnode;
p->data = e;
p->next = NULL;
rear->next = p;
rear = p;
++size;
#else
if (size == queuelen)
{
front->data = e;
front = front->next;
rear = rear->next;
}
else
{
rear = rear->next;
rear->data = e;
size++;
}
#endif
}
template<class ElemType>
ElemType *queue<ElemType>::pop_front() throw(out_of_range)
{
if(empty())
throw("queue is empty");
#if 0
qnode *p;
p = front->next;
front->next = p->next;
if(rear == p)
rear = front;
ElemType e = p->data;
delete p;
--size;
return e;
#else
qnode *p;
p = front->next;
front = p;
--size;
return (&(p->data));
#endif
}
}
#endif