定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)
进行删除操作,而在表的后端(rear)
进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。先进者先出,这就是典型的队列。
额外特性队列
- 循环队列
- 阻塞队列
- 并发队列
分类
- 用数组实现的队列叫做顺序队列;
- 用链表实现的队列叫做链式队列;
和栈的区别
栈来说,只需要一个栈顶指针就可以了。但是队列需要两个指针:一个是 head
指针,指向队头;一个是tail
指针,指向队尾。
循环队列
需要做好判断队空和队满的情况。
在用数组实现的非循环队列中,队空的判断条件是 head == tail
,队满的判断条件是 tail == n
。
循环队列中,队空的判断条件是 head == tail
,队满的判断条件是(tail+1)%n=head
。当队列满时, tail 指向的位置实际上是没有存储数据的。所以,循环队列会浪费一个数组的存储空间。如下图。
阻塞队列
在队列基础上增加了阻塞操作。就是在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回。