Java 数据结构 - 队列(Queue)

Java 中的队列(Queue)数据结构

1. 队列的定义

队列是一种遵循先进先出(FIFO:First In First Out)原则的线性数据结构。它类似于现实生活中的排队情况:第一个进入队列的元素将是第一个被移出队列的元素。

2. 队列的基本操作

  1. 入队(Enqueue):在队列尾部添加元素
  2. 出队(Dequeue):从队列头部移除元素
  3. 查看(Peek):查看队列头部元素但不移除
  4. 判空(isEmpty):检查队列是否为空

3. Java 中的 Queue 接口

Java 提供了 Queue 接口,它扩展了 Collection 接口。Queue 接口的主要方法包括:

  • offer(E e): 将元素添加到队列尾部
  • poll(): 移除并返回队列头部的元素,如果队列为空则返回 null
  • peek(): 返回队列头部的元素,但不移除,如果队列为空则返回 null
  • element(): 返回队列头部的元素,但不移除,如果队列为空则抛出异常
  • remove(): 移除并返回队列头部的元素,如果队列为空则抛出异常

4. 实现队列

4.1 使用 LinkedList 实现队列

LinkedList 类实现了 Queue 接口,因此可以直接用作队列:

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // 入队
        queue.offer("Apple");
        queue.offer("Banana");
        queue.offer("Cherry");

        System.out.println("Queue: " + queue);

        // 出队
        String front = queue.poll();
        System.out.println("Removed element: " + front);

        // 查看
        System.out.println("Head of queue: " + queue.peek());

        System.out.println("Updated queue: " + queue);
    }
}

4.2 使用数组实现简单队列

public class ArrayQueue {
    private int[] array;
    private int front;
    private int rear;
    private int capacity;
    private int count;

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

    public void enqueue(int item) {
        if (isFull()) {
            System.out.println("Queue is full!");
            return;
        }
        rear = (rear + 1) % capacity;
        array[rear] = item;
        count++;
    }

    public int dequeue() {
        if (isEmpty()) {
            System.out.println("Queue is empty!");
            return -1;
        }
        int item = array[front];
        front = (front + 1) % capacity;
        count--;
        return item;
    }

    public int peek() {
        if (isEmpty()) {
            System.out.println("Queue is empty!");
            return -1;
        }
        return array[front];
    }

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

    public boolean isFull() {
        return count == capacity;
    }
}

5. 队列的应用

队列在计算机科学和日常编程中有广泛的应用,例如:

  1. 任务调度
  2. 广度优先搜索(BFS)算法
  3. 缓冲区管理
  4. 消息传递系统

6. Java 中的其他队列实现

  1. PriorityQueue:优先队列,基于优先级堆实现
  2. ArrayDeque:双端队列,可以在两端进行插入和删除操作
  3. BlockingQueue:支持并发操作的队列

7. 队列的优缺点

优点:

  • 保持元素的插入顺序
  • 适用于需要先进先出处理的场景
  • 在多线程环境中可以作为数据缓冲区

缺点:

  • 只能在队列的两端进行操作
  • 随机访问效率低

8. 总结

队列是一种重要的数据结构,在处理需要按特定顺序处理元素的问题时非常有用。Java 提供了多种队列实现,可以根据具体需求选择合适的实现。理解队列的工作原理和应用场景对于设计高效的算法和系统架构至关重要。

posted @ 2024-07-20 16:55  KenWan  阅读(584)  评论(0)    收藏  举报