学习数据结构与算法的时候,我们学到的队列Queue与FIFO紧密相关,First Input First Output,先进先出。
队列是一种特殊的线性表,特点是两端一端进一端出,与日常生活中不含插队的排队相似,所以名为队列。
队列与栈应该是非常工具性的数据结构了,栈一端进出,具有LIFO的特点,与FIFO迥异。
队列的应用通常被阐释为实际中的排队活动,实际上它在计算机系统以及算法实现中用途广泛。
FIFO队列常常用作算法实现的辅助数据结构,特别是递归算法的非递归实现。 DFS的非递归实现需要借助栈,BFS的非递归实现需要借助队列。
消息队列MQ、输入队列、输出队列、就绪队列、等待队列……在计算机系统和大规模软件系统中,我们经常可以看到队列的身影。
队列往往可以被这样用于计算机系统中:
- 解决主机与外部设备之间速度不匹配的问题。
- 解决由多用户引起的资源竞争问题。
实际的队列未必是FIFO队列。以操作系统进程状态转化中涉及到的就绪队列而言,其实现可以是FIFO队列、优先队列、树或简单的无序链表等,不必是传统意义上的FIFO队列。
比如说模拟的网络打印机的设计。其队列固然可以用FIFO队列,却也可以用优先队列等。
优先队列与FIFO队列关系不大,底层的经典实现是堆,其应用也是比较广泛的,毕竟我们不可能一直只使用FIFO队列。
编程语言往往对队列提供了实现,优先队列格外被重视。 比如Java的java.util.Queue接口,它可以使用LinkedList作为双向链队列的实现;又比如Java的java.util.PriorityQueue,直接提供了优先队列的实现。 C++的STL中也提供了头文件#include
下的priority_queue
实现。
学好栈和队列,对于提升我们的算法实现能力,大有裨益。