java实现队列数据结构代码详解

Java实现队列数据结构代码详解

1. 队列数据结构简介

队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。

2. 队列实现方法

队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。

2.1 顺序队列

顺序队列基于数组实现,按照队列的先进先出原则,队列头在数组的左边,队列尾在数组的右边。每次出队操作都会把队列头移动到下一个位置,每次入队操作都会把元素放到队列尾。

2.1.1 顺序队列的实现

public class ArrayQueue<E> {
    private int head;
    private int tail;
    private int size;
    private Object[] data;

    public ArrayQueue(int capacity) {
        data = new Object[capacity];
        head = 0;
        tail = 0;
        size = 0;
    }

    public boolean enqueue(E element) {
        if (size == data.length) {
            return false;
        }
        data[tail] = element;
        tail = (tail + 1) % data.length;
        size++;
        return true;
    }

    public E dequeue() {
        if (size == 0) {
            return null;
        }
        E element = (E) data[head];
        head = (head + 1) % data.length;
        size--;
        return element;
    }
}

2.1.2 顺序队列的示例说明

ArrayQueue<Integer> queue = new ArrayQueue<>(3);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
System.out.println(queue.enqueue(4)); // false
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

2.2 链式队列

链式队列基于链表实现,按照队列的先进先出原则,在链表尾部插入元素,在链表头部删除元素。

2.2.1 链式队列的实现

public class LinkedListQueue<E> {
    private Node<E> head;
    private Node<E> tail;
    private int size;

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

    public boolean enqueue(E element) {
        Node<E> node = new Node<>(element, null);
        if (tail == null) {
            head = node;
            tail = node;
        } else {
            tail.next = node;
            tail = tail.next;
        }
        size++;
        return true;
    }

    public E dequeue() {
        if (size == 0) {
            return null;
        }
        E element = head.data;
        head = head.next;
        if (head == null) {
            tail = null;
        }
        size--;
        return element;
    }

    private static class Node<E> {
        E data;
        Node<E> next;

        public Node(E data, Node<E> next) {
            this.data = data;
            this.next = next;
        }
    }
}

2.2.2 链式队列的示例说明

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

3. 总结

队列是一种非常实用的数据结构,可以帮助我们实现很多算法和应用。在Java中,队列可以通过数组或链表来实现。顺序队列基于数组实现,链式队列基于链表实现。两者都支持入队和出队操作,但它们的实现方式略有不同,可以根据具体需求选择合适的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现队列数据结构代码详解 - Python技术站

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

相关文章

  • InputStream数据结构示例解析

    InputStream数据结构示例解析 InputStream是Java中一个重要的数据结构,它表示可以从其中读取数据的输入流。通常情况下,它表示的是用来读取字节流数据的输入流。在本篇攻略中,我们将会详细解释如何使用InputStream数据结构来读取字节流数据,并且给出两条具体的读取示例。 InputStream类的继承结构 InputStream类是一个…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之反转链表的方法详解

    C++数据结构与算法之反转链表的方法详解 在C++中,反转链表是一种常见的数据结构与算法技巧。在本文中,我们将详细讲解反转链表的实现过程以及常见的两种反转方法。 基本定义 在开始讲述反转链表算法之前,我们先介绍一下链表的基本定义。 链表是一种数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。下面是一个简单的链表的节点结构定义: struct …

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之队列

    带你了解Java数据结构和算法之队列 一、介绍 队列是已知的最古老和最常用的数据结构之一。它是一个线性结构,它遵循一个先进先出的原则,在日常生活中我们也很容易碰到队列。比如:在银行排队办理业务、队列中的电影厅、厨房中的菜单等等。 队列的操作主要有两种:入队(enqueue)和出队(dequeue)。插入操作只能在队尾进行,删除操作只能在队头进行。还有一些常用…

    数据结构 2023年5月17日
    00
  • Go 数据结构之二叉树详情

    Go 数据结构之二叉树详情 二叉树是一种树形数据结构,它的每个节点至多只有两个子节点,通常称为左子节点和右子节点。在本文中,我们将介绍二叉树的定义、遍历方法和常见应用场景。 定义 一个二叉树是一个有根树,它的每个节点最多有两个子节点,用左子树和右子树来区分。 在 Go 代码中,可以通过如下结构体定义表示二叉树的节点: type Node struct { L…

    数据结构 2023年5月17日
    00
  • Java数据结构之对象比较详解

    Java数据结构之对象比较详解 在Java中,比较两个对象的内容是否相等一直是程序员们比较困惑的问题。本文将详细探讨Java中对象比较的几种方式,并给出相应的示例。 基本类型比较 在Java中,比较基本类型的值可以使用双等号(==)进行判断。例如: int a = 1; int b = 1; boolean result = a == b; System.o…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • C++数据结构之红黑树的实现

    《C++数据结构之红黑树的实现》是一篇介绍红黑树实现的文章,通过本文,你可以了解到什么是红黑树以及如何实现红黑树。 什么是红黑树 红黑树是一种自平衡的二叉查找树,它具有良好的平衡性和查找性能。红黑树可以在O(log n)的时间内完成查找、插入和删除操作。 红黑树的一个重要性质是它的任何一个节点都有一个颜色(红色或黑色)属性。在插入、删除操作中,需要通过一定的…

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
合作推广
合作推广
分享本页
返回顶部