队列
1. 队列的定义:队列是一个有序列表(ordered list),而且所有添加动作只能在一个特定的入口进行,删除动作只能在一个特定的出口进行。
2. 队列的应用有:
- 计算机系统处理打印的工作。
- CPU 提供的分时(time sharing)工作方式。
- 键盘缓冲区的应用。
3. 队列的数据是有序列表, 而且是一个接着一个, 所以用数组来表示队列,按队列所要存放的数据是文字或数字来定义队列,例如文字时用 char 类型,数字时用 int 类型等。
如 char queue[100] 或 int queue[100]。队列另外还需3个产量辅助其操作,一个是队列最大容量 maxq,另一个是队首位置 front,另一个是队尾位置 rear,这3者般是数字类型,一般 front 和 rear 的初始值是-1。
4. 队列因为有入口和出口可以移动数据,所以队列的基本操作有两种:添加数据 addq 和删除数据 delq。
5. 以数组来表示的线性队列,在 addq()算法中, rear 会一直往后增加,当 rear ==maxq -1 时,表示队列已满,不能再加入数据;在 delq()算法中,front 会一直往后增加, rear == front 时,表示队列已空了,不能再删除数据。
6. 除非这个队列确实每个位置都放入了数据,才是“队列已满”,或队列中没有任何数据可供删除时,才是“队列已空”,否则队列可以一直运转,这种队列结构称为循环队列(circular queue)。
7. 以数组来表示的循环队列,在addq()算法中,rear 会一直增加,然后根据数组大小取余数,所以当(rear+1 % maxq)== front 时,即表示队列已满,不能再加入数据;在delq()算法中,front 会一直往后增加, 然后根据数组大小取余数,当 rear == front 时,表示队列已空了,不能再删除数据。
8. 队列结构经常用在计算机系统的运作中,例如 CPU 的时间安排、接口设备的I/O中断、操作系统(如Windows)的事件处理(如按鼠标键、移动鼠标、键盘输入等事件)、或者打印机打印队列等。一般不会只用单一队列,不会是“先到先处理”的方式,而是会同时应用多种策略,例如优先级高者先执行,最久未被处理的先执行,处理量(处理时间)最少(短)者优先处理,所以队列要稍加调整才能应对上述的问题。
9. 线性队列和循环队列只能有唯一的入口和唯一的出口,此称为单向队列(single-end-queue),队列可加以变化成为两端都可作为入口和出口的双向队列(double-end-queue, dqueue)。