Java数据结构之循环队列简单定义与用法示例

Java数据结构之循环队列简单定义与用法示例

什么是循环队列?

循环队列是一种数据结构,它具有先进先出(FIFO)的特点,即最先进队列的元素总是被最先取出。不同于普通队列,循环队列的尾指针指向数组的头部,因此可以实现循环利用数组空间,提高存储空间的利用率,避免因队列的操作大量移动数组元素而导致的时间浪费。

循环队列的基本操作

循环队列的基本操作包括:入队、出队、判断队列是否为空、判断队列是否已满、求队列长度。

下面是循环队列的基本数据结构定义:

public class CircularQueue {
    private int[] array;
    private int front;
    private int rear;
    private int size;

    public CircularQueue(int n) {
        array = new int[n];
        front = 0;
        rear = 0;
        size = n;
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return (rear + 1) % size == front;
    }

    public int getLength() {
        return (rear - front + size) % size;
    }

    public boolean enqueue(int item) {
        if (isFull()) {
            return false;
        }
        array[rear] = item;
        rear = (rear + 1) % size;
        return true;
    }

    public int dequeue() {
        if (isEmpty()) {
            return Integer.MIN_VALUE;
        }
        int item = array[front];
        front = (front + 1) % size;
        return item;
    }
}

上述代码中,front表示队列头的下标,rear表示队列尾的下标,array是存储队列元素的数组,size表示队列的大小。当队列满时,(rear+1)%size == front。

示例1:利用循环队列解决约瑟夫问题

约瑟夫问题是一个经典的问题,它的描述如下:

在计算机程序设计中,经常用到一个变体:$N$个人围成一圈,从第$1$个人开始报数,报到$M$的那个人出列,然后从出列的下一个人开始重新报数,报到$M$的那个人又出列,直到所有人出列为止。这个问题的解决策略就是使用循环队列。

代码如下:

public class Josephus {
    public static void main(String[] args) {
        int n = 7;
        int m = 3;
        CircularQueue queue = new CircularQueue(n);
        for (int i = 1; i <= n; i++) {
            queue.enqueue(i);
        }
        while (!queue.isEmpty()) {
            for (int i = 0; i < m - 1; i++) {
                queue.enqueue(queue.dequeue());
            }
            System.out.print(queue.dequeue() + " ");
        }
    }
}

上述代码中,将$n$个人的编号,分别放到循环队列中,然后不断取出队头的元素报数,直到所有的人都出列为止。

示例2:利用循环队列实现打印队列元素

以下代码实现利用循环队列输出队列中的元素:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        CircularQueue queue = new CircularQueue(5);
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入五个数据:");
        for (int i = 0; i < 5; i++) {
            int num = scanner.nextInt();
            queue.enqueue(num);
        }
        while (!queue.isEmpty()) {
            System.out.print(queue.dequeue() + " ");
        }
    }
}

上述代码中,首先创建了一个循环队列,用于存储用户输入的五个数。然后,调用Scanner类的nextInt()方法读取用户输入的数字,并将其存储到循环队列中。最后,使用循环队列的出队操作,将所有元素输出。

总结

循环队列是一种非常常用的数据结构,可以提高空间的利用率,避免因为队列操作对数组元素的移动而造成的时间浪费。同时,循环队列也具有先进先出的性质,非常适用于需要按照顺序处理数据的场景。在实际应用中,循环队列还有着更广泛的应用,例如在操作系统中,循环队列被广泛应用于缓存管理、任务调度以及内存分配等方面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之循环队列简单定义与用法示例 - Python技术站

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

相关文章

  • 如何使用C语言实现平衡二叉树数据结构算法

    使用C语言实现平衡二叉树数据结构算法可以分为以下几个步骤: 第一步:了解平衡二叉树 平衡二叉树是一种二叉搜索树,它具有以下特点: 高度平衡:每个节点的左右子树的高度差不能超过1。 有序性:对于任意一个节点,它的左子树中的所有节点都小于它,它的右子树中的所有节点都大于它。 平衡二叉树的优点在于它的查找、插入和删除操作都可以在O(log n)的时间内完成,比较快…

    数据结构 2023年5月17日
    00
  • C语言数据结构时间复杂度及空间复杂度简要分析

    C语言数据结构时间复杂度及空间复杂度简要分析 什么是时间复杂度和空间复杂度? 在分析算法和数据结构的性能时,时间复杂度和空间复杂度是必须考虑的因素。 时间复杂度:衡量算法执行时间所需的资源,也就是算法的速度。通常使用“大O符号”来表示时间复杂度,例如O(1)、O(n)、O(nlogn)等。 空间复杂度:衡量算法使用的内存资源,也就是算法的空间利用率。通常使用…

    数据结构 2023年5月17日
    00
  • C语言详解数据结构与算法中枚举和模拟及排序

    我们一步步来详细讲解“C语言详解数据结构与算法中枚举和模拟及排序”的完整攻略。 纲要 本文的主要内容包括: 枚举的概念及应用 模拟的概念及应用 排序的概念及分类 枚举的概念及应用 枚举是一种数据类型,可以将一组具有相关性质的常量定义为枚举常量。枚举常量默认是按照自然数递增的顺序进行编号的。枚举常量可以用于表示状态、类型、结果等概念。以下是一个枚举类型的定义:…

    数据结构 2023年5月17日
    00
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解 什么是位图? 位图,又称为比特图、Bitmap,是一种非常常用的数据结构。它是一种特殊的数组,只能存储0或1,可以用来表示一些二元状态,如二进制码、字符集、颜色等信息。在数据挖掘、工程设计、网络安全等领域都有广泛的应用。 位图的原理 位图的原理是用数据的位来表示某个元素对应的值。如果对应位为1,则代表该元素存在,否则代表该…

    数据结构 2023年5月17日
    00
  • C++数据结构深入探究栈与队列

    C++数据结构深入探究栈与队列 简介 栈和队列是常见的数据结构,尤其在程序设计和算法中都是不可或缺的。本文将深入讲解C++中栈和队列的实现原理和基本操作,并提供两个示例说明其应用。 栈(Stack)基本操作 栈的定义 栈是一种线性数据结构,具有后进先出(Last In First Out, LIFO)的特点。栈可以用数组或链表实现。 栈的操作 push() …

    数据结构 2023年5月17日
    00
  • C语言数据结构不挂科指南之线性表详解

    C语言数据结构不挂科指南之线性表详解 本篇攻略将为大家介绍C语言数据结构中的线性表,包括定义、实现和应用。希望能够为初学者提供帮助,让大家轻松学习和掌握线性表的相关知识。 一、线性表的定义 线性表是由一组元素构成的有限序列,其中每个元素可以有零个或一个前驱元素,也可以有零个或一个后继元素。线性表通常用于存储和处理具有相同类型的数据元素。 线性表的实现方式有多…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • 数位dp

    数位dp 思想 一般来说,题目是要求在区间\([l,r]\)中符合某一种条件的数的个数 我们用前缀和的思想考虑,分别求出\([1,r]\)和\([1,l-1]\)中数的个数相减即为所求 这里采用记忆化搜索的方式实现 模板 #include<iostream> #include<cstring> #include<vector&g…

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