当前位置:   article > 正文

数据结构——队列(包括循环队列)——Java版

数据结构——队列(包括循环队列)——Java版

目录

队列介绍:

基本概念:

应用:

Java实现示例:

循环队列的Java实现:


队列介绍:

队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO,First-In-First-Out)的原则管理数据。在现实生活中,队列的概念很容易理解,就像是排队等待服务的人群一样。在计算机科学领域,队列同样扮演着重要的角色,在算法和程序设计中被广泛应用。

基本概念:

1. 入队和出队
队列的两个主要操作是入队(enqueue)和出队(dequeue)。入队指将元素添加到队列的末尾,而出队则是从队列的头部移除一个元素。这两个操作遵循FIFO原则,即先入队的元素会先被出队。

2. 队首和队尾
队列中的第一个元素称为队首(front),而最后一个元素称为队尾(rear)。入队操作会将元素添加到队尾,而出队操作会移除队首元素。

应用:

 1. 算法中的应用
队列在算法中有着广泛的应用,特别是在图的遍历、广度优先搜索(BFS)、迷宫求解等问题中。它们通常用于管理待处理的节点或状态,以确保按照正确的顺序进行处理。

2. 数据结构中的应用
队列可以作为其他数据结构的基础,例如实现线程池、任务调度器、缓冲区等。在这些应用中,队列用于存储待处理的任务或数据,并按照先进先出的顺序进行处理。

Java实现示例:

注意:此队列使用了动态数组可以自动扩容,避免了固定大小数组的限制,如果想用静态数组可以在代码的基础上修改一下,这里我就不展示了

另外,此队列代码实现运用了泛型的相关知识,对泛型还不太了解的小伙伴,可以看一下我下期作品:深入探究Java中的泛型

  1. public class Queue<T> {
  2. private T[] elements; // 用于存储队列元素的数组
  3. private int front; // 指向队列头部的指针
  4. private int rear; // 指向队列尾部的指针
  5. private int size; // 队列中元素的数量
  6. private static final int DEFAULT_CAPACITY = 10; // 默认初始容量
  7. private static final int RESIZE_FACTOR = 2; // 扩容因子
  8. // 构造函数,初始化队列
  9. public Queue() {
  10. elements = (T[]) new Object[DEFAULT_CAPACITY];
  11. front = 0;
  12. rear = -1;
  13. size = 0;
  14. }
  15. // 入队操作,将元素添加到队尾
  16. public void enqueue(T element) {
  17. // 检查队列是否需要扩容
  18. if (size == elements.length) {
  19. resize();
  20. }
  21. // 队尾指针移动并添加元素
  22. rear = (rear + 1) % elements.length;
  23. elements[rear] = element;
  24. size++;
  25. }
  26. // 出队操作,从队首移除元素并返回
  27. public T dequeue() {
  28. // 检查队列是否为空
  29. if (isEmpty()) {
  30. throw new IllegalStateException("队列为空");
  31. }
  32. // 获取队首元素并移动队首指针
  33. T element = elements[front];
  34. front = (front + 1) % elements.length;
  35. size--;
  36. return element;
  37. }
  38. // 获取队首元素,但不移除
  39. public T peek() {
  40. // 检查队列是否为空
  41. if (isEmpty()) {
  42. throw new IllegalStateException("队列为空");
  43. }
  44. return elements[front];
  45. }
  46. // 检查队列是否为空
  47. public boolean isEmpty() {
  48. return size == 0;
  49. }
  50. // 获取队列大小
  51. public int size() {
  52. return size;
  53. }
  54. // 扩容队列
  55. private void resize() {
  56. int newCapacity = elements.length * RESIZE_FACTOR;
  57. T[] newElements = (T[]) new Object[newCapacity];
  58. for (int i = 0; i < size; i++) {
  59. newElements[i] = elements[(front + i) % elements.length];
  60. }
  61. elements = newElements;
  62. front = 0;
  63. rear = size - 1;
  64. }
  65. }
循环队列的Java实现:

循环利用数组空间: 循环队列通过循环利用数组空间,避免了因队列元素出队导致的空间浪费问题。

入队、出队操作高效: 循环队列的入队和出队操作时间复杂度均为 O(1),因为它们只涉及修改队尾指针和队首指针,并不需要移动数组元素。

固定大小: 循环队列通常具有固定的大小,一旦初始化后大小不会改变。
 

  1. public class CircularQueue<T> {
  2. private T[] elements; // 用于存储队列元素的数组
  3. private int front; // 队列头部指针,指向队首元素
  4. private int rear; // 队列尾部指针,指向队尾元素的下一个位置
  5. private int size; // 队列中元素的数量
  6. private static final int DEFAULT_CAPACITY = 10; // 默认初始容量
  7. // 默认构造函数,创建指定容量的循环队列
  8. public CircularQueue() {
  9. elements = (T[]) new Object[DEFAULT_CAPACITY];
  10. front = 0;
  11. rear = -1;
  12. size = 0;
  13. }
  14. // 带有容量参数的构造函数,创建指定容量的循环队列
  15. public CircularQueue(int capacity) {
  16. elements = (T[]) new Object[capacity];
  17. front = 0;
  18. rear = -1;
  19. size = 0;
  20. }
  21. // 入队操作,将元素添加到队尾
  22. public void enqueue(T element) {
  23. // 检查队列是否已满
  24. if (isFull()) {
  25. throw new IllegalStateException("队列已满");
  26. }
  27. // 计算新的rear位置
  28. rear = (rear + 1) % elements.length;
  29. elements[rear] = element;
  30. size++;
  31. }
  32. // 出队操作,从队首移除元素并返回
  33. public T dequeue() {
  34. // 检查队列是否为空
  35. if (isEmpty()) {
  36. throw new IllegalStateException("队列为空");
  37. }
  38. T element = elements[front];
  39. // 移动front指针
  40. front = (front + 1) % elements.length;
  41. size--;
  42. return element;
  43. }
  44. // 获取队首元素,但不移除
  45. public T peek() {
  46. if (isEmpty()) {
  47. throw new IllegalStateException("队列为空");
  48. }
  49. return elements[front];
  50. }
  51. // 检查队列是否为空
  52. public boolean isEmpty() {
  53. return size == 0;
  54. }
  55. // 检查队列是否已满
  56. public boolean isFull() {
  57. return size == elements.length;
  58. }
  59. // 获取队列大小
  60. public int size() {
  61. return size;
  62. }
  63. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号