队列基础知识
简介
如图(图片来源极客时间的《数据结构与算法之美》专栏)

只允许队尾入队,队头出队(即先进先出)的存储结构。
顺序队列
使用数组实现的队列,一般面试常考的队列是循环队列(下面介绍实现)。该队列的特点是:
- 队列大小固定
- 出队和入队的时间复杂度为O(1)
链式队列
使用链表的方式实现的队列,该队列的特点为:
- 队列大小不限
- 出队和入队的时间复杂度为O(1)
常见算法
实现一个循环队列
循环队列是由双指针 head 、 tail 分别指向队列头和队列尾来实现的。实现循环队列时要注意其队列是否为空和队列是否已经满的判断。条件如下:
队列为空:head == tail
队列已经满:(tail + 1)%capacity == head
代码如下:
class LoopQueue{
int[] queue = null;
int capacity = 0;
int head = 0;
int tail = 0;
public LoopQueue(int capacity) {
this.capacity = capacity;
queue = new int[capacity];
}
public void add(int val){
if((tail + 1) % capacity == head){
System.out.println("队列已满");
}else {
System.out.println("插入值:"+val);
tail = tail%capacity;
queue[tail] = val;
tail++;
}
}
public void remove(){
if(head%capacity == tail){
System.out.println("队列已空");
}else {
head = head%capacity;
int val = queue[head];
System.out.println("删除的值为:"+val);
head++;
}
}
}
设计循环双端队列
设计实现双端队列。
你的实现需要支持以下操作:
MyCircularDeque(k):构造函数,双端队列的大小为k。
insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
isEmpty():检查双端队列是否为空。
isFull():检查双端队列是否满
示例:
MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
circularDeque.insertLast(1); // 返回 true
circularDeque.insertLast(2); // 返回 true
circularDeque.insertFront(3); // 返回 true
circularDeque.insertFront(4); // 已经满了,返回 false
circularDeque.getRear(); // 返回 2
circularDeque.isFull(); // 返回 true
circularDeque.deleteLast(); // 返回 true
circularDeque.insertFront(4); // 返回 true
circularDeque.getFront()

本文详细介绍了队列的基础知识,包括顺序队列和链式队列的特性,以及如何实现循环队列和循环双端队列。此外,文章探讨了滑动窗口最大值问题的两种解决方案,并提供了相关代码实现。最后,列举了面试中常考的与队列相关的算法题。
——队列及其相关算法&spm=1001.2101.3001.5002&articleId=127063398&d=1&t=3&u=ea4aa2179dac44a7888c244165b5ba8a)
1553

被折叠的 条评论
为什么被折叠?



