数据结构中队列(数据结构循环队列队满)
导语:技术连载:数据结构 - 队列及其变种(循环、双端、阻塞、并发)
队列队列是一种典型的“先进先出”FIFO的数据结构;这个特点与栈正好相反;
队列的应用非常广泛,也有很多对应的变种,后面会针对常见的“循环队列”、“双端队列”、“优先级队列”、“并发队列”进行详细介绍;
队列的基本操作入队操作(enqueue)、出队操作(dequeue)以及队列中元素的个数
队列实现队列可以使用数组实现,也可以使用链表实现;
数组实现:
使用数组实现略微复杂,需要设定两个指针,一个指向队列头,另一个指向队列尾;
一般的入队和出队操作只需要移动指针即可,从前面的指针出队,后面的指针入队;
需要考虑的是当入队时,如果数组空间不够,这时候需要搬移元素(因为数组前面有一些已经出去的元素);
链表实现:
链表实现相对简单,同时记录头尾结点,从尾结点入队,头结点出队即可;
特殊队列循环队列:
循环队列主要解决数组实现队列时的数据搬移问题,同样使用数组实现,如果尾指针移动到数组最后一个元素之后,再次移动时只需要移动到第0个位置即可(如果头指针位置大于0);
判断队列满的条件时(tail + 1) % n ==head; 当满足这个条件时表明队列已满
循环队列
双端队列:
双端队列支持从队尾插入或删除元素;也支持从队列头部插入和删除元素;java中的Deque就是双端队列的实现;
双端队列在实际应用中并没有普通队列或者栈应用广,但在某些特定场景下会特别适合,比如:判读字符串是否是回文串;
你知道双端队列的其他应用吗?欢迎留言评论~
优先级队列:
优先级队列一般通过"堆"这种数据结构来实现,队列元素的弹出顺序时根据元素的优先级进行的;插入和弹出元素的时间复杂度为O(log(n))
优先级队列的应用非常广泛,比如线程池中的某些调度机制、有限资源的使用管理(带宽管理),迪杰斯特拉算法,霍夫曼编码以及一些最佳搜索算法等。
阻塞队列
阻塞队列是在普通队列基础上增加了阻塞机制,即出队列时,如果队列为空则阻塞,直到有元素插入队列再返回;
入队列时,如果没有空闲位置,则阻塞直到有空闲位置时,再插入返回;
并发队列
即线程安全的队列
下一篇文章将分析java中的各种队列实现;
推荐:
技术连载:开篇词
技术连载:连载提纲设计思路
技术连载:数据结构 - 数组
技术连载:数据结构 - 数组常见面试题汇总
技术连载:数据结构 - 链表
技术连载:数据结构 - 链表相关的高频面试题汇总
技术连载:数据结构 - 栈
技术连载:数据结构 - 栈在面试中的应用
本文内容由快快网络小林创作整理编辑!