学习笔记|数据结构——队列

学习笔记|数据结构——队列
具象理解
把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出。本质是一种操作受限的线性表数据结构
队列示意图
基本操作:入队,放一个数据到队列尾部;出队,从队列头部取一个元素
用数组实现的队列叫做顺序序列;用链表实现的队列叫做链式队列
顺序队列
需要两个指针:一个是head指针,指向队头;一个是tail指针,指向队尾
tail指针指向最后一个元素后边的位置
队列指针示意图
优化队列操作
对于顺序队列,当删除某个元素后,会导致数组中的数据不连续,需要进行数据搬移,若删除一个,搬移一次就会很慢。优化操作:在出队时,可以不用搬移数据。如果没有空余空间,我们只需要在入队的时候,再集中触发一次数据搬移操作
示意图
链式队列
同样需要两个指针:head指针和tail指针,分别指向链表的第一个节点和最后一个节点。
入队时,tail->next = new_node,tail = tail->next; 如果队空,head= new_node;tail = new_node;
出队时,head = head->next
链式队列出队入队示意图
循环队列
优化后的顺序队列,依然需要定期进行数据移动,为了解决这个弊病,设计了循环队列,即将首尾连起来
循环队列
队满:(tail+1)%n == head
队空: tail == head
入队:tail++ 代码:tail ==(tail+1)%n
出队:head++ 代码:head == (head+1)%n
不同类型队列,确定队空队满
1、顺序队列
队空:tail == head;
队满:tail == n && head ==0 n代表数组长度,已经比最后一位的索引大1了
3、链式队列
队空:tail == null;

2、循环数组
队满:(tail+1)%n == head
队空: tail == head
阻塞队列
在队列基础上增加了阻塞操作。在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回
基于阻塞队列实现的“生产者-消费者模型”,可以有效地协调生产和消费的速度,当生产者生产数据的速度过快,消费者来不及消费时,存储数据的队列很快就会满。这时候生产者就阻塞等待,直到消费者消费了数据,生产者才会被唤醒继续生产
基于阻塞队列,可以通过协调生产者和消费者的个数,提高数据的处理效率。
并发队列
在多线程情况下,会有多个线程同时操作队列,这时会存在线程安全问题。线程安全的队列叫做并发队列,实现方式是直接在enqueue、dequeue上加锁
处理策略:非阻塞的处理方式,直接拒绝请求任务;阻塞的处理方式:将请求排队,等到有空闲线程时,取出排队的请求继续处理。
存储请求可以使用队列做到先进者先服务。基于链表的实现方式,可以实现一个支持无限排队的无界队列,可能会导致过多的排队请求等待,请求处理的响应时间过长
基于数组实现的有界队列,线程池中排队的请求超过队列大小时,接下来的请求就会被拒绝,对响应时间敏感的系统来说,相对更加合理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值