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日

相关文章

  • 【ACM算法竞赛日常训练】DAY3题解与分析【旅游】【tokitsukaze and Soldier】

    DAY3共2题: 旅游 tokitsukaze and Soldier ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验): 旅游 题目传送门:https://ac.nowcoder…

    算法与数据结构 2023年4月18日
    00
  • JavaScript 数据结构之集合创建(1)

    当我们在编写JavaScript程序时,有时需要使用数据结构来组织和表示数据。其中之一是集合,它是一组无序且唯一的项的集合。这里就介绍如何在JavaScript中创建集合。 1. 集合定义 集合是一种不同于数组或对象,由一组彼此无关的元素组成的数据结构。集合中的元素是唯一的,即不允许重复元素。 2. 集合的操作 JavaScript中的集合可以支持以下常见操…

    数据结构 2023年5月17日
    00
  • ecnuoj 5039 摇钱树

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

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • Halcon学习教程(一) 之提取十字线中心 图像分割

      原文作者:aircraft   原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html      废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图。。。     上图有个十字线,我们要提取出十字线的中心(Hhhh这个线是我随手画的 没画直!!) 第一步:肯定是读取图像进行灰度提取处理啦。   …

    算法与数据结构 2023年4月18日
    00
  • C++抽象数据类型介绍

    C++抽象数据类型介绍 什么是抽象数据类型? 抽象数据类型(Abstract Data Type,ADT),是数据类型的一个数学模型。它实现了数据类型的抽象过程,将数据与操作分离,使得操作具有独立性,而数据只作为函数参数和返回值存在。 举个例子,ADT可以定义一个栈(Stack),栈的实现需要以下操作: 初始化栈 压入数据 弹出数据 获取栈顶数据 检查栈是否…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的两种搜索算法详解

    Java数据结构之图的两种搜索算法详解 引言 图是现实世界中最为普遍的现象之一,因此对于图的分析和操作是计算机科学和工程中最为重要的问题之一。在本文中,我们将对图结构的两种搜索算法进行详细讨论和研究,这些算法是图论研究的基本工具。 图的定义 在计算机科学和数学领域中,图是由若干个节点(或称为顶点)和它们之间的边组成的一种数据结构。 图的两种搜索算法 图的搜索…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用椎栈

    C语言实现通用数据结构之通用椎栈 概述 通用椎栈(Generic Linked List Stack),简称GLL Stack,是一种通用的数据结构,能够以动态的方式存储和访问任意类型的数据。GLL Stack 采用链表实现,可以进行进栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等基本操作。 基本操作 数据结构定…

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