链式队列:
template<class T>
struct QNode
{
T data;
QNode *next;
QNode(T m_data=0):data(m_data),next(NULL){};
};
template<class T>
class MyQueue
{
public:
MyQueue();
~MyQueue();
void EnQueue(T& elem);//元素入队列
bool DeQueue(T& elem);//元素出队列,即删除队头元素
bool IsEmpty();//判断队列是否为空
int QueueLength();//队列的长度
private:
QNode<T> *front;//队头指针
QNode<T> *rear;//队尾指针
};
template<class T>
MyQueue<T>::MyQueue()
{
front=new QNode<T>;
rear=front;
rear->next=NULL;
}
template<class T>
void MyQueue<T>::EnQueue(T &elem)
{
QNode<T> *p=new QNode<T>(elem);
rear->next=p;
rear=p;
}
template<class T>
bool MyQueue<T>::DeQueue(T& elem)
{
if(!IsEmpty())
{
QNode<T>* p=front->next;
front->next=p->next;
elem=p->data;
delete p;
return true;
}
else
{
return false;
}
}
template<class T>
bool MyQueue<T>::IsEmpty()
{
if(front->next==NULL)
return true;
else
return false;
}
template<class T>
int MyQueue<T>::QueueLength()
{
int len=0;
QNode<T> *p=front;
while(p->next)
{
len++;
p=p->next;
}
return len;
}
template<class T>
MyQueue<T>::~MyQueue()
{
T elem;
while(front->next)
{
QNode<T>* p=front->next;
front->next=p->next;
delete p;
p=0;
}
delete front;
}
循环队列:
const int MAXSIZE=20;
class CircleQueue
{
public:
CircleQueue():base(new int[MAXSIZE]),front(0),rear(0){};
~CircleQueue()
{
delete base;
front=0;
rear=0;
};
int QueueLength()
{
return (rear-front+MAXSIZE)%MAXSIZE;
}
bool Enqueue(int elem)
{
if((rear+1)%MAXSIZE==front)
{
cout<<"队列满了"<<endl;
return false;
}
else
{
base[rear]=elem;
rear=(rear+1)%MAXSIZE;
return true;
}
}
bool Dequeue(int &data)
{
if(front==rear)
{
cout<<"队列为空"<<endl;
return false;
}
else
{
data=base[front];
front=(front+1)%MAXSIZE;
return true;
}
}
bool IsEmpty()
{
if(rear==front)
return true;
else
return false;
}
private:
int *base;//初始化动态分配存储空间
int front;//指向队首
int rear;//指向队尾
};