链式队列
链式队列(linked queue)的实现是对链表实现做了简单的修改。下面代码给出了链式队列类的说明。成员front和rear分别是指向队首和队尾元素的指针。链式队列的实现也不需要表头元素。
template <class Elem>
class LQueue : public Queue<Elem>
{
private:
Node<Elem>* front; // 队首元素
Node<Elem>* rear; // 队尾元素
int size; //当前队列大小
public:
LQueue()
{
front = nullptr;
rear = nullptr;
size = 0;
}
~LQueue() { clear(); }
// 清空队列
void clear()
{
while (front != nullptr)
{
rear = front;
front = front->next;
delete rear;
}
rear = nullptr;
size = 0;
}
// 入队
bool enqueue(const Elem& elem)
{
// 如果是空列表
if (rear == nullptr)
front = rear = new Node<Elem>(elem, nullptr);
else
{
rear->next = new Node<Elem>(elem, nullptr);
rear = rear->next;
}
++size;
return true;
}
// 出队,并返回队首元素
bool dequeue(Elem& elem)
{
if (size == 0) return false;
elem = front->element;
Node<Elem>* ntemp = front;
front = front->next;
delete ntemp;
// 如果出队的是最后一个元素
if (front == nullptr) rear = nullptr;
--size;
return true;
}
// 返回队首元素
bool frontValue(Elem& elem) const
{
if (size == 0) return false;
elem = front->element;
return true;
}
// 返回队列长度
int length() const
{
return size;
}
};
链式队列的成员函数只需对链表的相应部分稍加改动。由于这种实现方法没有表头结点,因此在队列函数中必须单独处理插入到空队列的特殊情况,以及由dequeue函数导致的空队列的特殊情况。从本质上讲,enqueue只是简单地把新元素放到链表尾部(rear指向的结点),然后修改rear指针指向新的链表节点。dequeue只是简单地去掉表中的最前面的一个结点,并修改front指针。