队列是线性表的一种特殊形式,所有排队场景都是一个队列,记录访问顺序时也经常用到队列。
栈也是线性表的一种特殊形式,递归函数的运行过程、算术表达式的处理过程都会用到栈。
队列(queue)是线性表的一种特殊形式,其遵循先进先出(FirstInFirstOut,FIFO)的原则。队列有两个关键位置:队尾和队头。队尾是允许执行插入操作的位置,而队头是允许执行删除操作的位置。刚开始时,队列是空的,没有任何元素。例如,在超市购物时,需要结账的顾客加入队列的队尾,也就是新插入的元素成为队尾元素。一个顾客结完账就离开了,排在最前面的顾客就可以开始结账,该顾客就是当前队头元素。这种方式保证了先来的顾客先离开队列,体现了先进先出的原则。队列不允许"插队"因此不允许在队尾以外的其他地方插入元素,也不允许删除其他位置的元素。队列中排队的人数称为队列的长度,当队列中没有顾客时,称为空队列。
这种先进先出的特性使得队列非常适合用来管理需要按照顺序处理的任务,例如打印机的打印任务、消息传递系统中的消息处理任务等。
队列的基本操作有以下5个
-
创建队列。create0(在本书中用构造函数替代):创建一个空队列。
入队。enQueue(x):将元素x插入队尾,使之成为队尾元素。
-
出队。deQueueO:删除队头元素并返回队头元素值。
-
读取队头元素。getHead():返回队头元素值。
-
判队列空。isEmptyO:若队列为空,返回true,否则返回false。
根据队列的基本操作,可以得到队列抽象类的定义。
queue.h
//
// 队列抽象类
//
#ifndef DS_QUEUE_H
#define DS_QUEUE_H
template <class elemType>
class queue {
public:
virtual void enQueue(const elemType &x) = 0; // 入队
virtual elemType deQueue() = 0; // 出队
virtual elemType getHead() const = 0; // 读取队头元素
virtual bool isEmpty() const = 0; // 判队列空
virtual ~queue() {} // 虚析构函数
};
#endif //DS_QUEUE_H
与顺序表不同,队列的插入和删除操作是固定在队尾与队头进行的。
和队列一样,栈(stack)也是一种常见的线性表。在中,插入和删除操作被限定在表的某一端进行。假设每天晚上要把火车停在一条轨道上轨道的尽头是封闭的,那么这个轨道就是一个栈。允许进行插入和删除操作的一端称为"栈顶",另一端称为"栈底"。也就是说,火车只能从一个方向离开,且一列火车要离开的时候,需要把在它之后进入轨道的火车都先移开。栈顶位置的元素称为栈顶元素,若栈中没有元素,则称为"空栈"当需要让一列火车进入轨道时,可以将它放在栈顶,也就是当前空的位置这个过程称为"进栈"(或入栈)。而当需要让一列火车驶离轨道时,则从栈顶取出一列火车,这个过程被称为"出栈"。栈也被叫作"后进先出"的线性表
C++标准库中的队列
std::queue是C++标准库中的队列实现。
//
// C++标准库中的队列
//
#include <iostream>
using namespace std;
int main() {
std::queue<int> queue;
queue.push(1);//元素入队
queue.push(2);
queue.push(3);
queue.push(4);
queue.pop();//元素出队
int front = queue.front();//访问队首元素
int size = queue.size();//获取队列的长度
bool empty = queue.empty();//判断队列是否为空
cout << front << " " << size << " " << empty << endl;
return 0;
}