链式队列在进队时无队满问题,但有队空问题。
队空条件为 front == NULL
目录
队列抽象数据类型(模板)
template <class E>
class Queue {
public:
Queue() { }; //构造函数
~Queue() { }; //析构函数
virtual bool EnQueue(E x) = 0; //进队列
virtual bool DeQueue(E& x) = 0; //出队列
virtual bool getFront(E& x) = 0; //取队头
virtual bool IsEmpty() const = 0; //判队列空
virtual bool IsFull() const = 0; //判队列满
};
建立链式队列(声明)
#include <iostream.h>
#include “Queue.h”
template <class E>
struct QueueNode { //队列结点类定义
E data; //队列结点数据
QueueNode<E> *link; //结点链指针
};
template <class E>
class LinkedQueue {
private:
QueueNode<E> *front, *rear; //队头、队尾指针
public:
LinkedQueue() : rear(NULL), front(NULL) { }
~LinkedQueue();
bool EnQueue(E x);
bool DeQueue(E& x);
bool GetFront(E& x);
void MakeEmpty(); //实现与~Queue()相同
bool IsEmpty() const { return front == NULL; }
};
清空队列
template <class E>
LinkedQueue<E>::~LinkedQueue() { //析构函数
QueueNode<E> *p;
while (front != NULL) { //逐个结点释放
p = front; front = front->link; delete p;
}
};
进队
template <class E>
bool LinkedQueue<E>::EnQueue(E x) {
//将新元素x插入到队列的队尾
if (front == NULL) { //创建第一个结点
QueueNode<E> *p;
p=new QueueNode;
p->data=x;
front = p;
rear = p;
if (front == NULL)//判断分配失败的情况
return false;
}
else { //队列不空, 插入
QueueNode<E> *p;
p=new QueueNode;
p->data=x;
rear->link = p;
if (rear->link == NULL)
return false;
rear = rear->link;
}
return true;
};
出队
template <class E>
//如果队列不空,将队头结点从链式队列中删去
bool LinkedQueue<E>::DeQueue(E& x) {//引用直接改x值
if (IsEmpty() == true)
return false; //判队空
QueueNode<E> *p = front;
x = front->data;
front = front->link;
delete p;
return true;
};