队列 笔记
2018-10-10 本文已影响15人
秋缘未了
队列是一种先进先出的数据结构,跟栈类似,队列是一种操作受限的线性表。
队列同样可以由数组和链表来实现。
队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。
## 顺序队列
顺序队列存在一个问题, tail 指针移动到数组最大下标时,即使数组中还有空闲空间,也无法继续往队列中添加数据了。
解决方法是在入队列时,如果没有空闲空间,就触发一次搬运,将 head 到 tail 之间的数据,整体搬运到数组的 0 到 tail - head 位置。
## 链式队列
链式队列与顺序队列的区别是没有容量限制,在请求排队的场景下,如果排队的请求数量过多,请求处理的响应时间会过长。
## 循环队列
循环队列是为了解决顺序队列在 tail == n 时,需要数据搬运操作的问题。
队列为空时可以根据 head == tail 来判断。循环队列满时,tail 指针位置不存储数据,所以队满判断公式为:
(tail + 1) % n = head
## 阻塞和并发队列
阻塞队列在队列为空的时候,从队头取数据会被阻塞,直到队列中有数据才会返回;如果队列已经满了,插入数据操作会被阻塞,直到队列中有空闲的位置后再插入,然后再返回。
在考虑线程安全时,需要用到并发队列,并发队列同一时刻只允许一个插入操作,但是允许多个读操作。