先进先出队列(FIFO)——固定容量的队列
1. 引言
在计算机科学中,队列(Queue)是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。先进先出队列可以用于多种应用场景,如任务调度、进程管理等。本文将介绍如何使用Java实现一个固定容量的先进先出队列,并提供相应的代码示例。
2. 先进先出队列的基本概念
先进先出队列是一种特殊的线性表,它只允许在表的一端(队尾)进行插入操作,而在另一端(队头)进行删除操作。当有元素进入队列时,它将排在队列尾部,而只有队头的元素才能被删除。
先进先出队列可以用来处理数据按照时间顺序的应用场景,如消息队列、缓冲区等。在这些场景下,新的数据会被添加到队列的尾部,而被处理的数据则从队列的头部被删除。
3. 先进先出队列的实现
为了实现一个固定容量的先进先出队列,我们可以使用数组和指针来表示队列的结构。以下是一个基于数组实现的先进先出队列的Java代码示例:
public class FixedSizeQueue<T> {
private final int capacity;
private final Object[] queue;
private int front;
private int rear;
private int size;
public FixedSizeQueue(int capacity) {
this.capacity = capacity;
this.queue = new Object[capacity];
this.front = 0;
this.rear = -1;
this.size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public boolean isFull() {
return size == capacity;
}
public void enqueue(T item) {
if (isFull()) {
throw new IllegalStateException("Queue is full");
}
rear = (rear + 1) % capacity;
queue[rear] = item;
size++;
}
public T dequeue() {
if (isEmpty()) {
throw new NoSuchElementException("Queue is empty");
}
T item = (T) queue[front];
front = (front + 1) % capacity;
size--;
return item;
}
public int size() {
return size;
}
}
在上述代码中,我们使用了一个固定大小的数组来存储队列的元素。front
和rear
分别表示队列的头部和尾部,而size
表示队列当前的大小。具体实现中,我们使用了取模操作来处理循环队列的情况。
4. 先进先出队列的应用举例
为了更好地理解先进先出队列的应用,我们以一个简单的任务调度系统为例进行说明。假设我们有多个任务需要按照时间顺序执行,并且每次只能执行一个任务。此时,我们可以使用先进先出队列来管理这些任务。
以下是一个简化的任务调度系统的代码示例:
public class TaskScheduler {
private final FixedSizeQueue<Runnable> taskQueue;
public TaskScheduler(int capacity) {
this.taskQueue = new FixedSizeQueue<>(capacity);
}
public void enqueueTask(Runnable task) {
taskQueue.enqueue(task);
}
public void runTasks() {
while (!taskQueue.isEmpty()) {
Runnable task = taskQueue.dequeue();
task.run();
}
}
}
在上述代码中,我们定义了一个TaskScheduler
类,它使用了一个先进先出队列来管理任务。通过调用enqueueTask
方法,我们可以将需要执行的任务添加到队列中。而调用runTasks
方法时,队列中的任务会按照先进先出的顺序被逐个执行。
5. 先进先出队列的时间复杂度分析
对于基于数组实现的先进先出队列,其常见操作的时间复杂度如下:
- 入队操作(enqueue)的时间复杂度为O(1);
- 出队操作(dequeue)的时间复杂度为O(1);
- 判断队列是否为空(