队列(Queue)是一种常见的数据结构,用于存储和管理元素,其中元素按照先进先出(First-In-First-Out,FIFO)的原则进行操作。简单来说,队列就像是排队等候服务的人群,最先到达的人将首先接受服务,而后到达的人则需要等待前面的人完成服务后才能接受服务。
队列的主要特性包括:
- 入队(Enqueue):将一个元素添加到队列的末尾。
- 出队(Dequeue):从队列的头部移除并返回第一个元素。
- 头部(Front):队列的第一个元素。
- 尾部(Rear/Back):队列的最后一个元素。
- 队列大小(Size):队列中元素的数量。
队列可以用于许多场景,例如任务调度、广度优先搜索算法(BFS)、多线程编程、打印任务管理等。在编程中,队列常常通过数组或链表来实现。数组实现的队列称为顺序队列,链表实现的队列称为链式队列。
由于队列可以有多种实现方法,所以面向接口,便于规范。
先创建一个 Queue 接口:
public interface Queue<E>
{
/**
* 向尾部插入值
* @param value 待插入的值
* @return 插入成功返回true,否则返回false
*/
boolean offer(E value);
/**
* 从头部删除值
* @return 如果队列为空,返回null,否则返回队头的值
*/
E poll();
/**
* 获取队头的值
* @return 如果队列为空,返回null,否则返回队头的值
*/
E peek();
/**
* 检查队列是否为空
* @return 如果队列为空,返回true,否则返回false
*/
boolean isEmpty();
/**
* 判断队列是否已满
* @return 满返回 true ;否则 false
*/
boolean isFall();
}
我们先用数组来实现,其实光数组实现就有很多种实现方式,我这里挑了一个比较好方式:
public class ArrayQueue3<E> implements Queue<E>,Iterable<E>
{
private final E[] array;
private int head;
private int tail;
/**
* 有参构造创建队列
* @param capacity 队列容量
*/
public ArrayQueue3(int capacity)
{
array = (E[])new Object[capacity];
head = 0;
tail = 0;
}
/**
* 重写迭代器
*/
@Override
public Iterator<E> iterator()
{
return new Iterator<E>()
{
private int p = head;//从队头开始
/**
* 判断是否有下一个元素
* @return 如果有返回true,否则返回false,next()方法终止
*/
@Override
public boolean hasNext()
{
return p != tail; //如果p == tail,说明已经到队尾了,没有下一个元素了
}
/**
* 获取下一个元素
* @return 下一个元素
* p % array.length 为了防止p超出数组长度,因为p会一直增加。
*/
@Override
public E next()
{
E value = array[p % array.length];
p++;//p自增,为下次调用next()做准备
return value;
}
};
}
/**
* 实现i