数据结构实现 2.3:链表队列(C++版)
1. 概念及基本框架
在前面第三节中,我们通过 动态数组 实现了 队列 这种数据结构。当然,队列也可以通过 链表 来实现所谓的 链表队列 。
链表队列的结构如上图所示,链表队列有着队列的基本特性:
1.队列 有 队头 和 队尾 两端。
2.入队 操作只能从 队尾 进行,出队 操作只能从 队头 进行。
3.先 入队 的先 出队 ,即 先进先出(First In First Out),FIFO 。
因为链表对链表末端操作时间复杂度较大,所以添加了一个 tail 指针,使得原来 O(n) 的时间复杂度变成了 O(1) 级别的。由于 tail 指针的加入,而且我们的操作也只针对 head 和 tail ,所以可以去掉虚拟头结点,因此我们需要从底层来重新构建这个类。
与数组队列类似,可以利用一个由 纯虚函数 构成的 抽象类 作为一个接口来定义这些操作。具体代码如下:
template <class T>
class Queue{
public:
virtual int size() = 0;
virtual bool isEmpty() = 0;
virtual void print() = 0;
//入队操作
virtual void enqueue(T num) = 0;
//出队操作
virtual void dequeue() = 0;
//获得队首元素
virtual T front() = 0;
};
下面只需要通过继承 抽象类,并且重写 纯虚函数 ,就可以完成 链表队列 的实现。链表队列类的框架如下:
template <class T>
class LinkedListQueue : public Queue<T>{
public:
LinkedListQueue(){
head = NULL;
tail = NULL;
m_size = 0;
}
...
private:
Node<T> *head;
Node<T> *tail;
int m_size;
};
其中的 Node 类是第五节链表中定义的一个类,这里不再重复定义,直接使用,Node 类的定义如下:
template <class T>
class Node