概念:
队列也是一种“操作受限”的线性表,体现在先进先出原则
常见操作:
入队:队列尾部放入数据
出队:队列头部取一个数据
常见队列:
普通队列:
1. 由于队列是在两端进行操作,需要两个指针,一个是head指针,指向对头;一个是tail指针,指向队尾
2. 入队的就是尾指针给后移动,出队的时候头指针会向后移动
3. 使用数组实现的队列就是顺序队列,使用链表实现的就是链式队列
4. 在顺序队列中,判断队列的条件是tail = n,队空的条件是head=tail
5. 在顺序队列中,当尾指针指向数组最后一个位置时,入队操作就有问题,此时head由于出队操作已经后移,数组中有位置,为了利用这部分空间,因此出现循环队列,就是让数组首尾相连,当尾指针指向最后一个位置时,再次从数据第一个位置开始,循环队列判断队满和队空的条件是重点。
6. 实际应用中,出现阻塞队列和并发队列
7. 阻塞队列就是给队列增加阻塞机制,入队的时候如果队列满的就会阻塞等待队列有空余位置,出队的时候如果队空就会阻塞队列有数据,常应用生产-消费中
双端队列:
是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在队列的两端进行。在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列),输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了
优先级队列:
1. 是0个或者多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有查找、插入一个新元素或删除
2. 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。
3. 对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。
4. 最突出的优先就是自动排序,本质上是堆实现,故入队和出队的效率都是log(n),因此也不是线性结构
常考面试题
1. 使用两个队列实现一个栈
2. BFS使用队列
3. 滑动窗口