Java实验指导书实验四 - 队列的实现与应用

引言

在编程中,队列是一种非常常见的数据结构。它遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被取出。队列在日常生活中也有很多应用,比如排队买票、打印队列等。在Java中,我们可以通过数组或链表来实现队列。

本文将介绍队列的概念和实现方式,并通过Java代码示例讲解如何使用队列。

队列的概念

队列是一种线性数据结构,它可以看作是一种特殊的线性表。队列有两个基本操作:入队(enqueue)和出队(dequeue)。入队表示将一个元素插入到队列的尾部,而出队表示将队列中的头部元素移除,并返回其值。

队列的特点是遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被取出。队列可以用来解决很多实际问题,比如处理任务的顺序、线程池的任务调度等。

队列的实现方式

队列可以通过数组或链表来实现。下面分别介绍这两种实现方式。

数组实现队列

数组实现队列的思想是使用一个数组来保存队列中的元素,并通过两个指针来指示队列的头部和尾部。这两个指针分别称为"front"和"rear"。当有元素入队时,将元素插入到rear指针所指的位置,并将rear指针向后移动一位;而当有元素出队时,将front指针向后移动一位,并返回front指针所指的元素。

下面是使用数组实现队列的Java代码示例:

public class ArrayQueue {
    private int[] queue;
    private int front;
    private int rear;
    private int size;

    public ArrayQueue(int capacity) {
        queue = new int[capacity];
        front = 0;
        rear = -1;
        size = 0;
    }

    public void enqueue(int item) {
        if (isFull()) {
            throw new IllegalStateException("Queue is full");
        }
        rear = (rear + 1) % queue.length;
        queue[rear] = item;
        size++;
    }

    public int dequeue() {
        if (isEmpty()) {
            throw new IllegalStateException("Queue is empty");
        }
        int item = queue[front];
        front = (front + 1) % queue.length;
        size--;
        return item;
    }

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

    public boolean isFull() {
        return size == queue.length;
    }
}

链表实现队列

链表实现队列的思想是使用一个链表来保存队列中的元素,并通过两个指针来指示队列的头部和尾部。这两个指针分别称为"head"和"tail"。当有元素入队时,将元素插入到tail指针所指的位置,并将tail指针向后移动一位;而当有元素出队时,将head指针向后移动一位,并返回head指针所指的元素。

下面是使用链表实现队列的Java代码示例:

public class LinkedQueue {
    private Node head;
    private Node tail;
    private int size;

    private class Node {
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
        }
    }

    public void enqueue(int item) {
        Node newNode = new Node(item);
        if (isEmpty()) {
            head = newNode;
            tail = newNode;
        } else {
            tail.next = newNode;
            tail = newNode;
        }
        size++;
    }

    public int dequeue() {
        if (isEmpty()) {
            throw new IllegalStateException("Queue is empty");
        }
        int item = head.data;
        head = head.next;
        size--;
        return item;
    }

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

队列的应用

队列在实际应用中有很多用途,下面介绍两个常见的应用场景。

队列在多线程环