博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性结构-队列
阅读量:7087 次
发布时间:2019-06-28

本文共 1210 字,大约阅读时间需要 4 分钟。

hot3.png

队列的定义

队列(Queue)是只允许在一端进行插入,而在另一端进行删除的线性表。

允许删除的一端称为队头(Front)。 允许插入的一端称为队尾(Rear)。 当队列中没有元素时称为空队列。 队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。

顺序队列和链队列

顺序队列

顺序队列是基于顺序存储结构的,一般使用数组实现。在顺序队列中需要注意溢出的情况。

"下溢"现象 当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

"真上溢"现象 当队列满时,做入队运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

"假上溢"现象 由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

对于假上溢,有两种解决方案。

  • 采用平移元素的方法,即一旦发生“假溢出”就把整个队列的元素平移到存储区的首部。平移元素的方法效率是很低的。

  • 将整个队列作为循环队列来处理。这样,虽然物理上队尾在队首之前,但逻辑上队首仍然在前,作插入和删除运算时仍按"先进先出"的原则。

链队列

链队列采用链式结构实现,较之顺序队列不会出现溢出现象,而且出队、入队只需修改头结点或尾节点的地址。

java中的队列

Java根据几个关键标准提供队列实现:

  • 线程安全性: 如果不需要从多个线程同时访问队列,则可以使用一个简单的LinkedList作为队列;其他实现的优点是它们提供有效的线程安全性;

  • 是否阻塞: 各种阻塞队列实现增加了额外的方法来插入和删除队列中的元素,阻塞直到操作成为可能,并且具有可选的时间限制;

  • 是否有边界: 有时对可以适应队列的元素数量设置上限是有用的,例如以防止线程池在机器忙时排队太多任务;

  • 其他特殊操作: Java提供了按优先级排序和延迟的实现的队列。

Blocking? Other criteria Bound Non-bound
Blocking None ArrayBlockingQueue LinkedBlockingQueue
Blocking Priority-based PriorityBlockingQueue
Blocking Priority-based DelayQueue
Non-blocking Thread-safe ConcurrentLinkedQueue
Non-blocking Non thread-safe LinkedList
Non-blocking Non thread-safe, priority-based PriorityQueue

转载于:https://my.oschina.net/shenhuniurou/blog/949899

你可能感兴趣的文章
jms异步通信全攻略
查看>>
Apache2 服务器异常问题Your browser sent a request that this server could not understan
查看>>
HTTP常见状态码
查看>>
提交版本审核提示无效二进制文件Apps are not allowed to listen to device lock notifications....
查看>>
Confluence 6 复杂授权或性能问题
查看>>
Confluence 6 外部参考
查看>>
Linux磁盘分区-GPT分区
查看>>
gRPC在c#中的使用(服务端)
查看>>
Python之sys模块
查看>>
Eclipse+Maven+Nexus+Hudson+Svn自动部署
查看>>
通讯与互联网行业软件项目运作的一些不同
查看>>
Mantis 企业邮箱配置
查看>>
android-魔法泡泡动画分析(附源码)
查看>>
深入JVM专题
查看>>
Mac下如何安装配置Homebrew
查看>>
普通用户安装zabbix监控服务
查看>>
Nginx安装
查看>>
javascript构造对象的全过程
查看>>
Java 调用截图功能
查看>>
Mac OS X El Capitan 关闭sip
查看>>