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

yizhihongxing

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日

相关文章

  • ecnuoj 5039 摇钱树

    5039. 摇钱树 题目链接:5039. 摇钱树 感觉在赛中的时候,完全没有考虑分数规划这种做法。同时也没有想到怎么拆这两个交和并的式子。有点难受…… 当出现分数使其尽量大或者小,并且如果修改其中直接相关的某个值会导致分子分母同时变化的时候,还是要多想想分数规划的做法。 下面引用一下题解 另外这两个交和并的式子,令 \(a = S \and T, b = T…

    算法与数据结构 2023年4月17日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解 LinkedList简介 LinkedList是Java中的一个数据结构,它是一个双向链表,可以提供快速的插入和删除操作。LinkedList中的元素分别保存在每个节点中,每个节点包含了指向前一个节点和后一个节点的引用。 使用LinkedList的好处是,其可以快速的进行插入和删除操作,但是如果需要随机存取中…

    数据结构 2023年5月17日
    00
  • 动态开点线段树&线段树合并学习笔记

    动态开点线段树 使用场景 \(4 \times n\) 开不下。 值域需要平移(有负数)。 什么时候开点 显然,访问的节点不存在时(只会在修改递归时开点)。 trick 区间里面有负数时,\(mid = (l + R – 1) / 2\)。 防止越界。 例如区间 \([-1,0]\)。 开点上限 考虑到 update 一次最多开 \(\log V\) 个点(…

    算法与数据结构 2023年4月17日
    00
  • 环形队列的实现 [详解在代码中]

    1 package DataStructures.Queue.Array.Exerice; 2 3 /** 4 * @author Loe. 5 * @project DataStructures&Algorithms 6 * @date 2023/5/8 7 * @ClassInfo 环形队列 8 * 主要使用取模的特性来实现环形特征 9 */ 1…

    算法与数据结构 2023年5月8日
    00
  • 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 算法 问题 求 \(n\) 个单词在一个长度为 \(m\) 的文章里出…

    算法与数据结构 2023年5月5日
    00
  • JavaScript中的Map数据结构详解

    JavaScript中的Map数据结构详解 什么是Map数据结构 Map是JavaScript中一种新的数据结构,类似于对象,但是比对象更加灵活。Map可以将任意类型的值作为键名(包括对象、字符串、数字、布尔值等),并且不会将键名强制转换为字符串。Map的键值对个数没有限制,可以根据需要动态地增加或者删除键值对。Map内部实现了一个哈希表,因此增加、删除、查…

    数据结构 2023年5月17日
    00
  • Codeforces Round 871 (Div. 4)

    A.Love Story 题意: 给定n个长度为10的字符串,问其与codeforces字符串的对应下标字母不同的个数。 分析: 对于每个字符串从前往后依次和“codeforces”对应字符比较然后统计不同字母数即可 code: #include <bits/stdc++.h> using namespace std; int main() { …

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