数据结构与算法之美【总结笔记】 -- 队列

先进先出,就是典型的“队列”。

队列只支持两个基础操作:入队enqueue(),放一个数据到队尾,和,出队dequeue()从队列头部取一个元素。

队列和栈一样,也是一种操作受限的数据结构。

队列可以用数组实现,也可以用链表实现。用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。

在实现队列这中数据结构的时候,需要两个指针,一个head指针,指向队头,一个tail指针,指向队尾。

数组实现:

添加数据的时候,tail指针向后移一位,当取出数据的时候,head指针后移一位。在这会出现一个问题,随着数据的不停入队出队,两个指针一直后移,当tail移动到最右边的时候,head前面还有空间,但是无法添加数据了,这个问题怎么解决?

这个地方又要用到数组的数据搬移,当tail指向最右边的时候,判断一下head指针是否指向最左边,如果是的话就不再添加数据,如果不是,则将数据向左迁移。这个操作的平均时间复杂度是O(1)

链表实现:

链表实现同样需要两个指针,入队时进行操作tail->next = newCode,tail = tail -> next;出队操作head = head ->next 

链式队列可以无限入队出队。

循环队列

将数组的首尾相连,当tail指针指向最后一个位置时,再添加数据时,指向下标为0的位置,这样就实现了一个循环队列。

循环队列不难理解,但是他的代码实现要更难些,最重要的是,确定好队空和队满的条件。

循环队列为空 head = tail

循环队列满 (tail+1)%n = head 【n为数组长度,队满时,tail指针指向的位置是没有数据的,所有循环队列会浪费一个存储空间】

阻塞队列和并发队列

阻塞队列是在队列基础上增加阻塞操作。简单来说,就是队列为空的时候,取数据会被阻塞,等到队列中有数据了以后才能返回,如果队列已经满了,那么插入数据就会被阻塞,队列中有空闲位置后再插入数据,然后返回。阻塞队列是一个很标准的生产者和消费者的模型。

并发队列,最直接的方法是在入队和出队的方法上加锁,可以使用CAS原子操作,可以实现高效的并发队列。

 

问题:

除了线程池这种池结构会用到队列派对请求,你还知道有哪些类似的池结构或者场景中会用到队列的派对请求?

分布式应用中的消息队列,也是一种队列结构。

如何实现无锁并发队列?

考虑使用CAS实现无锁队列,则在入队前,获取tail的位置,入队时比较tail是否发生变化,如果没有则允许入队,反之,本次入队失败。出队则获取head的位置比较,进行CAS。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值