概念
队列:只允许在一端进行 插入操作, 在 另一端进行删除操作。仍然是一种 特殊的线性表 ,队列具有 先进先出 的特性。
进行插入操作的一端称为 队尾(rear)
进行删除操作的一端称为 队头(front)
- 图示:
队列的使用
- 在Java中,Queue是个接口,底层是通过链表实现的。所以在使用时,必须实例化
LinkedList
的对象
队列的模拟(链表实现)
- 图解:
1. 入队列:offer
- 即尾插法 —— 无头双向链表尾插法思路
// 入队列
public void offer(int data) {
// 1.尾插
LinkedListNode node = new LinkedListNode(data);
if (head == null) {
head = node;
last = node;
} else {
last.next = node;
node.prev = last;
last = node;
}
size++;
}
2. 出队列
- 即删除头结点
思路
- 如果链表为空,返回null
- 如果链表只有一个结点,首尾指针置空
- 链表有多个结点,将头结点与其下一个结点 相断连接
// 出队列
public void poll() {
// 即删除头结点
// 1.如果链表为空,无法删除
if (head == null) {
return;
}else if (head == last) {
// 2.如果链表只有一个结点
head = null;
last = null;
}else {
// 3.链表有多个结点
head = head.next;
head.prev.next = null;
head.prev = null;
}
size--;
}
3. 获取队头元素
- 返回头结点数据即可
// 获取队头元素
public int peek() {
if (head == null) {
throw new RuntimeException("链表为空,无法获取");
}
return head.val;
}
4. 返回链表长度
- 因为我们已经定义了一个
size
用于表示链表长度,直接返回size
即可
// 获取链表长度
public int size() {
return size;
}
5. 判断队列是否为空
- 判断
size
是否为0
或者 判断头结点是否为空
public boolean isEmpty() {
// return head == null;
return size == 0;
}
双端队列(Deque)
概念
双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队
Deque是一个接口,使用时必须创建LinkedList的对象
说明:
- 双端队列用法与本章所模拟的队列用法是相同的,只不过更灵活,不作过多赘述