文章目录
队列
定义
队列是一种特殊的线性表,其特殊之处在于它只允许表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- 队列是一种受限的线性结构
- 队列只允许在头部入队,尾部出队
相较于“栈”结构关注于局部,“队列”结构更偏向于关注整体结构
排队的根本原因在于生产与消费的处理速度不对等的情况而产生的,例如单线程只能处理一件事务,但有多个事务需要处理,只能让线程处理一件事务,其余的事务等待线程处理完上一事务空闲出来后,再依次处理
类型
用数组实现的队列叫顺序队列,用链表实现的叫链式队列,与栈结构一至,顺序队列同样存在扩容问题,链式队列也同样存在指针指向的问题
顺序队列
用数组实现的队列即顺序队列
public class SeqQueue {
private Object[] queue;
private int frontCursor; // 头指针
private int rearCursor; // 尾指针
private int queueSize; // 队列大小
private int INCREMENT = 5; // 队列的扩容大小
public SeqQueue() {
queue = new Object[5]; // 开辟默认大小为5的空队列
queueSize = queue.length;
frontCursor = 0;
rearCursor = 0;
}
/**
* 向队列中插入元素
* @param o
*/
void push(Object o) {
if (isFull()) {
// 考虑到顺序队列的容量问题,自动扩容
Object[] temp = Arrays.copyOf(queue, queueSize + INCREMENT);
queueSize = temp.length;
queue = temp;
}
queue[frontCursor] = o; // 将元素放入头指针指向的位置
frontCursor++; // 头指针向后移动+1
}
/**
* 从队列中弹出元素
* @return
*/
Object pop() {
// if (!isEmpty()) {
// Object o = queue[rearCursor]; // 取出尾指针指向的元素
// queue[rearCursor] = null;
// rearCursor++; // 尾指针向后移动 +1
// return o;
// }
// 因为头指针及尾指针一直在向后移,当头尾指针重叠时,会造成伪溢出的情况
// 此时需要考虑弹出元素的时候,队列的移动
if