固定大小的队列

队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。在Java中,我们可以使用数组或链表来实现队列。但是,如果我们需要一个固定大小的队列,即队列的容量是固定的,该如何实现呢?

固定大小的队列的定义

固定大小的队列是一种特殊的队列,其容量是预先确定的,并且一旦达到容量上限,再添加元素将会导致队列溢出。这种队列的实现需要考虑到添加和删除元素时的边界条件。

实现固定大小的队列

我们可以使用数组来实现固定大小的队列。首先,我们需要定义一个数组来存储队列的元素,然后使用两个指针来追踪队列的头和尾。

public class FixedSizeQueue {
    private int[] queue;
    private int head;
    private int tail;
    private int size;
    
    public FixedSizeQueue(int capacity) {
        queue = new int[capacity];
        head = 0;
        tail = 0;
        size = 0;
    }
    
    public void enqueue(int element) {
        if (size == queue.length) {
            throw new IllegalStateException("Queue is full");
        }
        
        queue[tail] = element;
        tail = (tail + 1) % queue.length;
        size++;
    }
    
    public int dequeue() {
        if (size == 0) {
            throw new IllegalStateException("Queue is empty");
        }
        
        int element = queue[head];
        head = (head + 1) % queue.length;
        size--;
        
        return element;
    }
    
    public boolean isEmpty() {
        return size == 0;
    }
    
    public boolean isFull() {
        return size == queue.length;
    }
}

在上面的代码中,我们定义了一个FixedSizeQueue类,它包含一个queue数组用于存储队列的元素,headtail指针用于追踪队列的头和尾,size表示队列的元素个数。

enqueue方法中,我们首先检查队列是否已满,如果已满,则抛出异常。否则,我们将元素添加到tail位置,并更新tail指针和size

dequeue方法中,我们首先检查队列是否为空,如果为空,则抛出异常。否则,我们将取出head位置的元素,并更新head指针和size

isEmpty方法用于检查队列是否为空,isFull方法用于检查队列是否已满。

使用固定大小的队列

现在,我们来看一下如何使用固定大小的队列。

public class Main {
    public static void main(String[] args) {
        FixedSizeQueue queue = new FixedSizeQueue(5);
        
        queue.enqueue(1);
        queue.enqueue(2);
        queue.enqueue(3);
        
        System.out.println(queue.dequeue()); // 输出:1
        System.out.println(queue.dequeue()); // 输出:2
        
        queue.enqueue(4);
        queue.enqueue(5);
        
        System.out.println(queue.dequeue()); // 输出:3
        System.out.println(queue.dequeue()); // 输出:4
        System.out.println(queue.dequeue()); // 输出:5
        
        System.out.println(queue.isEmpty()); // 输出:true
        System.out.println(queue.isFull()); // 输出:false
    }
}

在上面的示例中,我们首先创建了一个容量为5的固定大小队列。然后,我们通过调用enqueue方法向队列中添加元素,再通过调用dequeue方法从队列中取出元素。最后,我们使用isEmptyisFull方法检查队列是否为空或已满。

流程图

flowchart TD
    A[开始] -->|创建固定大小队列| B[创建固定大小的队列]
    B --> C[添加元素]
    C --> D[判断队列是否已满]
    D -- 是 --> E[抛出异常]
    D -- 否 --> F[更新尾指针和元素个数]
    F --> G[取出元素]
    G --> H[判断队列是否为空]
    H -- 是 --> I[抛出异常]
    H -- 否 --> J[更新头指针和元素个数]
    J --> C
    F