队列 笔记

队列是一种先进先出的数据结构,跟栈类似,队列是一种操作受限的线性表。

队列同样可以由数组和链表来实现。

队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。

## 顺序队列

顺序队列存在一个问题, tail 指针移动到数组最大下标时,即使数组中还有空闲空间,也无法继续往队列中添加数据了。

解决方法是在入队列时,如果没有空闲空间,就触发一次搬运,将 head 到 tail 之间的数据,整体搬运到数组的 0 到 tail - head 位置。

## 链式队列

链式队列与顺序队列的区别是没有容量限制,在请求排队的场景下,如果排队的请求数量过多,请求处理的响应时间会过长。

## 循环队列

循环队列是为了解决顺序队列在 tail == n 时,需要数据搬运操作的问题。

队列为空时可以根据 head == tail 来判断。循环队列满时,tail 指针位置不存储数据,所以队满判断公式为:

(tail + 1) % n = head

## 阻塞和并发队列

阻塞队列在队列为空的时候,从队头取数据会被阻塞,直到队列中有数据才会返回;如果队列已经满了,插入数据操作会被阻塞,直到队列中有空闲的位置后再插入,然后再返回。

在考虑线程安全时,需要用到并发队列,并发队列同一时刻只允许一个插入操作,但是允许多个读操作。

你可能感兴趣的:(队列 笔记)