📜  如何使用数组和泛型在Java实现队列?(1)

📅  最后修改于: 2023-12-03 15:08:26.557000             🧑  作者: Mango

如何使用数组和泛型在Java实现队列?

队列(Queue)是计算机科学中的一种数据结构,它是一种先进先出(First In First Out,FIFO)的线性表。队列的基本操作包括入队(Enqueue)、出队(Dequeue)、取队首元素(Peek)等。

在Java中,使用数组和泛型可以很方便地实现队列。下面我们来介绍一下具体的实现方法。

使用数组实现队列

数组实现队列的代码如下:

public class ArrayQueue<T> {
    private T[] data;
    private int size;
    private int front, rear;

    public ArrayQueue(int capacity) {
        this.data = (T[])new Object[capacity];
        this.size = 0;
        this.front = 0;
        this.rear = -1;
    }

    public void enqueue(T element) {
        if (size == data.length) {
            throw new RuntimeException("Queue is full.");
        }
        rear = (rear + 1) % data.length;
        data[rear] = element;
        size++;
    }

    public T dequeue() {
        if (size == 0) {
            throw new RuntimeException("Queue is empty.");
        }
        T element = data[front];
        front = (front + 1) % data.length;
        size--;
        return element;
    }

    public T peek() {
        if (size == 0) {
            throw new RuntimeException("Queue is empty.");
        }
        return data[front];
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public int size() {
        return size;
    }
}

在该代码中,我们使用了一个数组data存储队列中的元素,size表示队列的大小,front表示队首元素的下标,rear表示队尾元素的下标。其中,enqueue()方法用于入队,dequeue()方法用于出队,peek()方法用于取队首元素,isEmpty()方法判断队列是否为空,size()方法用于返回队列的大小。

需要注意的是,当队列的大小达到数组的容量时,我们需要循环利用数组的空间,即将队尾指针从数组尾部移到数组头部。

使用泛型实现队列

使用泛型实现队列的代码和使用数组实现队列的代码类似,只需要将数组中的类型从Object改为泛型类型即可。具体代码如下:

public class GenericQueue<T> {
    private T[] data;
    private int size;
    private int front, rear;

    public GenericQueue(int capacity) {
        this.data = (T[])new Object[capacity];
        this.size = 0;
        this.front = 0;
        this.rear = -1;
    }

    public void enqueue(T element) {
        if (size == data.length) {
            throw new RuntimeException("Queue is full.");
        }
        rear = (rear + 1) % data.length;
        data[rear] = element;
        size++;
    }

    public T dequeue() {
        if (size == 0) {
            throw new RuntimeException("Queue is empty.");
        }
        T element = data[front];
        front = (front + 1) % data.length;
        size--;
        return element;
    }

    public T peek() {
        if (size == 0) {
            throw new RuntimeException("Queue is empty.");
        }
        return data[front];
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public int size() {
        return size;
    }
}

在该代码中,我们使用了泛型T替代了具体的类型,使得该队列可以存储任意类型的元素。

总结

使用数组和泛型可以很方便地实现队列的数据结构。在实现队列时,需要注意处理队列大小达到数组容量时的情况,以及循环利用数组的空间。另外,在使用泛型时,需要注意类型转换的问题。