队列

队列

队列其实就和排队类似,先排队的人先买票,后排队的人排队伍的最后,而且不允许插队

其实队列和链表类似也是一种受限制的线性数据结构

总结来说是就是:先进者先出

队列操作

入队 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),但是可能会导致排队的太多,处理的时间就会很长,同时也可能浪费大量计算机资源来维护排队。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队线程池是不合适的。

有界队列

队列大小有限,所以线程池满的时候,请求的连接会直接被拒绝,这种方式对响应时间敏感的系统来说,就更加的合理。但是要在性能和资源中设置一个合适大小的队列是很讲究的。

极客时间版权所有: https://time.geekbang.org/column/article/41330

原文地址:https://www.cnblogs.com/zx125/p/11701376.html