队列
队列
队列其实就和排队类似,先排队的人先买票,后排队的人排队伍的最后,而且不允许插队
其实队列和链表类似也是一种受限制的线性数据结构
总结来说是就是:先进者先出
队列操作
入队 enqueue():放一个数据到队列的尾部
出队 dequeue():从队列头部取出一个元素
队列的两种实现
顺序队列:用数组实现
栈我们只需要一个指针就能实现,但是队列需要两个指针:一个是head指针,指向队头(用于出队),一个是tail指针,指向队尾(用于入栈)
向一个空队列插入4个元素
出队两个元素
问题
一般底层涉及到数组,都会有内存的问题
1.如果tail到了7,head不为0,这个时候就需要进行数据搬移,把数据搬到顶端,然后更新head和tail指针。
2.如果tail到7的时候,head为0,那么数据无法入队,只能出队
时间复杂度
出队是O(1),入队使用均摊时间复杂度为O(1)
链式队列:用链表实现
同样需要两个指针,一个指向头结点,一个指向尾结点
循环队列
我们知道,顺序队列还是涉及到了数据的搬运,为了解决这个问题设计出了循环队列,直接把数组头和尾相连,形成了一个环形。
问题
如何确定好队空和队满的判断条件
n为数组长度
可以这样来 (tail+1)%n=head
阻塞队列
阻塞队列其实就是在队列的基础上加了阻塞操作
入队:如果队列已经满了,阻塞,当队列有空在插入
出队:如果队列为空,出队阻塞,当队列有内容了在出队
可以和并发队列实现简单的生产者-消费者模型
并发队列
线程安全的队列叫做并发队列
实际应用
无界队列
基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致排队的太多,处理的时间就会很长,同时也可能浪费大量计算机资源来维护排队。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队线程池是不合适的。
有界队列
队列大小有限,所以线程池满的时候,请求的连接会直接被拒绝,这种方式对响应时间敏感的系统来说,就更加的合理。但是要在性能和资源中设置一个合适大小的队列是很讲究的。