java队列实现方法(顺序队列,链式队列,循环队列)

Java中队列数据结构可以通过顺序队列、链式队列和循环队列三种方法来实现。下面我们将针对这三种方法分别进行详细讲解。

顺序队列实现方法

1. 定义数据结构

首先我们需要定义一个存储元素的数组,以及头尾指针front和rear来记录队列中的元素位置。

public class SeqQueue<T> {
    private T[] data; // 存储元素的数组
    private int front; // 头指针
    private int rear; // 尾指针

    // 构造函数,初始化队列大小
    public SeqQueue(int size) {
        data = (T[]) new Object[size]; // 创建泛型数组
        front = -1;
        rear = -1;
    }
}

2. 入队操作

在队列中插入一个元素需要将元素放在队列的尾部,并更新rear指针。

public boolean enqueue(T element) {
    if (isFull()) { // 判断队列是否已满
        return false;
    }
    rear++;
    data[rear] = element; // 插入元素
    return true;
}

private boolean isFull() { // 判断队列是否已满
    return rear == data.length - 1;
}

3. 出队操作

从队列中取出一个元素需要将元素从队列的头部取出,并更新front指针。

public T dequeue() {
    if (isEmpty()) { // 判断队列是否为空
        return null;
    }
    front++;
    return data[front]; // 返回被取出的元素
}

private boolean isEmpty() { // 判断队列是否为空
    return front == rear;
}

链式队列实现方法

1. 定义数据结构

链式队列的底层数据结构采用链表的方式来实现,因此我们需要定义一个节点Node类来存储元素,以及一个链表类来维护队列。

public class LinkedListQueue<T> {
    private class Node<T> {
        private T data; // 存储元素的值
        private Node<T> next; // 指向下一个节点的指针

        public Node() {
            data = null;
            next = null;
        }

        public Node(T data) {
            this.data = data;
            next = null;
        }
    }

    private Node<T> head; // 队列头部指针
    private Node<T> tail; // 队列尾部指针

    public LinkedListQueue() {
        head = null;
        tail = null;
    }
}

2. 入队操作

入队操作需要创建一个新的节点,并将节点插入到队列的尾部。

public void enqueue(T data) {
    Node<T> newNode = new Node<T>(data); // 创建新节点
    if (head == null) { // 队列为空
        head = newNode;
        tail = newNode;
    } else {
        tail.next = newNode; // 尾部节点指向新节点
        tail = newNode; // 更新尾部指针
    }
}

3. 出队操作

取出队列中的元素需要将队列头部的节点取出,并将头指针指向下一个节点。

public T dequeue() {
    if (head == null) { // 队列为空
        return null;
    }
    Node<T> node = head; // 取出队头节点
    head = head.next; // 更新队列头指针
    return node.data; // 返回节点存储的元素
}

循环队列实现方法

1. 定义数据结构

循环队列需要定义一个数组来存储元素,并且设置头指针和尾指针。

public class CircularQueue<T> {
    private T[] data;
    private int front; // 头指针
    private int rear; // 尾指针

    public CircularQueue(int size) {
        data = (T[]) new Object[size]; // 创建泛型数组
        front = 0;
        rear = 0;
    }
}

2. 入队操作

入队操作需要将元素添加到队列的尾部,并更新尾指针。当尾指针到达数组末尾时,需要将尾指针指向数组开头来实现循环。

public boolean enqueue(T element) {
    if ((rear + 1) % data.length == front) { // 判断队列是否已满
        return false;
    }
    data[rear] = element; // 插入元素
    rear = (rear + 1) % data.length; // 更新尾指针
    return true;
}

3. 出队操作

出队操作需要将头部的元素取出,并更新头指针。当头指针到达数组末尾时,需要将头指针指向数组开头来实现循环。

public T dequeue() {
    if (front == rear) { // 判断队列是否为空
        return null;
    }
    T element = data[front]; // 取出元素
    front = (front + 1) % data.length; // 更新头指针
    return element;
}

示例说明

顺序队列示例

SeqQueue<Integer> queue = new SeqQueue<>(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); // 入队
System.out.println(queue.dequeue()); // 出队,输出3
System.out.println(queue.dequeue()); // 出队,输出4
System.out.println(queue.dequeue()); // 出队,输出null

链式队列示例

LinkedListQueue<Integer> queue = new LinkedListQueue<>();
queue.enqueue(1); // 入队
queue.enqueue(2);
queue.enqueue(3);
System.out.println(queue.dequeue()); // 出队,输出1
System.out.println(queue.dequeue()); // 出队,输出2
queue.enqueue(4); // 入队
System.out.println(queue.dequeue()); // 出队,输出3
System.out.println(queue.dequeue()); // 出队,输出4
System.out.println(queue.dequeue()); // 出队,输出null

循环队列示例

CircularQueue<Integer> queue = new CircularQueue<>(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
queue.enqueue(6); // 入队
System.out.println(queue.dequeue()); // 出队,输出4
System.out.println(queue.dequeue()); // 出队,输出5
System.out.println(queue.dequeue()); // 出队,输出6
System.out.println(queue.dequeue()); // 出队,输出null

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java队列实现方法(顺序队列,链式队列,循环队列) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Spring Security 构建rest服务实现rememberme 记住我功能

    让我来详细讲解一下如何利用Spring Security构建REST服务实现记住我(remember-me)功能。 什么是记住我功能? 记住我是一个常见的Web应用程序功能,允许用户在关闭并重新打开浏览器后继续使用应用程序而无需重新登录。通常,当用户登录时,他们可以选择“记住我”选项。如果选中此选项,则应用程序将在用户关闭并重新打开浏览器时,使用之前提供的凭…

    Java 2023年5月20日
    00
  • 自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结

    下面我来详细讲解一下“自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结”的完整攻略。 首先,我们来了解一下各个属性的含义。这里以移动设备浏览器为例: viewport:视口,用于设置浏览器的视口大小。 content:用于控制一些meta属性的设置,例…

    Java 2023年6月15日
    00
  • Java实现的简单字符串反转操作示例

    Java实现的简单字符串反转操作示例攻略 在java语言中,实现字符串反转操作非常简单。下面我将为你介绍一些常见的方法,以及示例代码。 方法一:使用StringBuilder的reverse()方法 StringBuilder是一个可变的字符串类,它提供了许多方便的方法,其中一个就是reverse()方法。其原理是将字符串中的所有字符进行反转操作。 publ…

    Java 2023年5月26日
    00
  • java二维数组指定不同长度实例方法

    实现Java二维数组指定不同长度的方法有很多种,下面我将罗列一些常用的方法,并提供两条示例说明。 方法一:定义不规则数组 不规则数组是指定义一个数组,其中包含若干行,每行的元素个数不同。例如: int[][] arr = new int[3][]; arr[0] = new int[]{1, 2}; arr[1] = new int[]{3, 4, 5}; …

    Java 2023年5月26日
    00
  • java实现两个文件的拼接

    拼接文本文件:利用FileReader和FileWriter类分别读取和写入文件内容,再利用BufferedReader和BufferedWriter类对文件内容进行缓存处理,实现拼接文本文件的操作。以下为示例代码: import java.io.BufferedReader; import java.io.BufferedWriter; import ja…

    Java 2023年5月26日
    00
  • JSON.toJSONString()空字段不忽略修改的问题

    “JSON.toJSONString()空字段不忽略修改的问题”指的是在Java中使用JSON.toJSONString()方法转换对象为JSON字符串时,如果对象中包含空字段的属性,转换后的JSON字符串默认会保留这些空字段,并以null值表示。而有时候我们希望转换后的JSON字符串不包含这些空字段,因此需要进行一些额外的处理。 解决该问题的方法有两种,分…

    Java 2023年5月26日
    00
  • Java中的synchronized 优化方法之锁膨胀机制

    Java中的synchronized 优化方法之锁膨胀机制 Java中的synchronized是一种线程安全的同步机制,能够保证多个线程访问同一个对象的方法或段代码时,只有一个线程执行,其他线程等待,直到执行完毕后才能继续执行。然而,synchronized也可能带来一些性能问题。因此,Java提出了一些优化方法,其中之一就是锁膨胀机制。 什么是锁膨胀机制…

    Java 2023年5月26日
    00
  • 详解java中的正则表达式

    详解Java中的正则表达式 什么是正则表达式 正则表达式是一种规则,用于匹配字符串中的文本。在文本中找到匹配的文本可以提供很多有用的信息,比如找出电话号码、电子邮件地址、日期等等。在Java中,我们可以使用正则表达式对字符串进行匹配。 模式匹配器 在Java中,我们可以使用java.util.regex包中的Pattern和Matcher来进行正则表达式匹配…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部