二、队列
队列(queue)仍为一种线性序列。与栈类似,队列也是受限的序列,其中一端只能够出,另一端只能够进。(联想排队时的情况)
只能在队尾插入(查询):enqueue(), rear()
只能在队首删除(查询):dequeue(), front()
下图摘自清华大学《数据结构(C++语言版)》
与栈结构恰好相反,队列中各对象的操作次序遵循先入先出(FIFO) 的规律。在社会资源或是各种计算资源的分配的场合中被广泛应用
2.1 ADT接口
操作 | 功能 |
---|---|
size() | 报告队列的规模(元素总数) |
empty() | 判断队列是否为空 |
enqueue(e) | 将e插入队尾 |
dequeue() | 删除并返回队首对象 |
front() | 引用队首对象 |
rear() | 引用队尾对象 |
2.2 Queue模板类
与栈同理,队列也属于序列,故亦可直接基于向量或者列表派生,继承(沿用)其size()和empty()接口,只需写其他的特殊接口。
由于队列需要在队首和队尾分别执行删除和插入操作,为降低复杂度,使用列表派生更加方便。
以下代码摘自清华大学《数据结构(C++语言版)
template <typename T> class Queue : public List<T> { //队列模板类(继承List原有接口)
public: //size()、empty()以及其它开放接口均可直接沿用
void enqueue(T const& e) { insertAsLast(e); } //入队:尾部插入
T dequeue() { return remove(first()); } //出队:首部删除
T& front() { return first()->data; } //队首
};
如此实现的队列接口,其时间复杂度均为常数O(1)