队列系列篇——数组模拟

2023-11-11

基本介绍 

数组模拟队列

代码实现

package com.wustyq.queue;

import java.util.Scanner;

/**
 * ClassName: ArrayQueueDemo <br/>
 * Description: <br/>
 * date: 2021/9/10 21:53<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue arrayQueue = new ArrayQueue(3);
        char key = ' '; //接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        //输出一个菜单
        while (loop) {
            System.out.println("s(show):显示队列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");

            key = scanner.next().charAt(0);
            switch (key) {
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':
                    try {
                        int res = arrayQueue.getQueue();
                        System.out.printf("取出的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

//使用数组模拟队列 - 编写一个ArrayQueue类
class ArrayQueue {
    private int maxSize; //表示数组的最大容量
    private int front; //队列头
    private int rear; //队列尾
    private int[] arr; //该数据用于存放数据,模拟队列

    //创建队列的构造器
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[this.maxSize];
        front = -1; //指向队列头部,分析出front是指向队列头的前一个位置
        rear = -1; //指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
    }

    //判断队列是否满
    public boolean isFull() {
        return rear == maxSize - 1;
    }

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

    //添加数据到队列
    public void addQueue(int n) {
        //判断队列是否满
        if (isFull()) {
            System.out.println("队列满,不能加入数据");
            return;
        }
        rear++;
        arr[rear] = n;
    }

    //获取队列的数据
    public int getQueue() {
        //判断队列是否为空
        if (isEmpty()) {
            //通过抛出异常
            throw new RuntimeException("队列空不能取数据");
        }
        front++;
        return arr[front];
    }

    //显示队列的所有数据
    public void showQueue() {
        //遍历
        if (isEmpty()) {
            System.out.println("队列空的,没有数据");
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }
    }

    //显示队列的头数据,注意不是取出数据
    public int headQueue() {
        //判断
        if (isEmpty()) {
            throw new RuntimeException("队列空的,没有数据");
        }
        return arr[front + 1];
    }
}

问题分析并优化

  1. 目前数组使用一次就不能用,没有达到复用的效果
  2. 将这个数组使用算法,改进成一个环形的队列 %

优化思路

代码实现 

package com.wustyq.queue;

import java.util.Scanner;

/**
 * ClassName: CircleArrayQueue <br/>
 * Description: <br/>
 * date: 2021/9/12 21:01<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class CircleArrayQueue {
    public static void main(String[] args) {
        CircleArray arrayQueue = new CircleArray(3);
        char key = ' '; //接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        //输出一个菜单
        while (loop) {
            System.out.println("s(show):显示队列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");

            key = scanner.next().charAt(0);
            switch (key) {
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':
                    try {
                        int res = arrayQueue.getQueue();
                        System.out.printf("取出的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

class CircleArray {
    private int maxSize; //表示数组的最大容量
    private int front; //队列头
    private int rear; //队列尾
    private int[] arr; //该数据用于存放数据,模拟队列

    public CircleArray(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }

    //判断是否为空
    private boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

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

    //添加数据
    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("队列已满");
            return;
        }
        arr[rear] = n;
        rear = (rear + 1) % maxSize;
    }

    //取出数据
    public int getQueue() {
        if (isEmpty()) {
            //通过抛出异常
            throw new RuntimeException("队列空不能取数据");
        }
        int ret = arr[front];
        front = (front + 1) % maxSize;
        return ret;
    }

    //显示队列的所有数据
    public void showQueue() {
        if (isEmpty()) {
            //通过抛出异常
            System.out.println("队列空不能取数据");
            return;
        }
        //思路:从front开始遍历 遍历多少个元素
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
        }
    }

    //求出当前队列有效数据的个数
    private int size() {
        return (rear + maxSize - front) % maxSize;
    }

    public int headQueue() {
        //判断
        if (isEmpty()) {
            throw new RuntimeException("队列空的,没有数据");
        }
        return arr[front];
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

队列系列篇——数组模拟 的相关文章

  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 由于连接超时,无法通过 ImageIO.read(url) 获取图像

    下面的代码似乎总是失败 URL url new URL http userserve ak last fm serve 126 8636005 jpg Image img ImageIO read url System out printl
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v

随机推荐

  • nuxt框架快速了解

    公司最近有一个文献检索系统的研发项目 也让我第一次接触到Nuxt js框架 Nuxt js 是一个基于 Vue js 的通用应用框架 它可以通过对客户端 服务端基础架构的抽象组织 Nuxt js 主要关注的是应用的 UI渲染 Nuxt js
  • Linux系统入门----虚拟机安装CentOS,jdk,tomcat,mysql的配置[笔记]

    随着学习的深入 要捣鼓一下Linux系统 还不错 虽然不如deepin系统那么好看 但是对于企业来讲常常用CentOS 这不我又开始搞事情了 大家习惯用Vmware或者VirtureBox但是Win10自带一个虚拟机软件 可以不用再下载Vm
  • matlab-lsqcurvefit函数

    lsqcurvefit函数 least squares curve fitting 用于最小二乘法求解非线性曲线拟合问题 即已知输入向量xdata和输出向量ydata 并且知道输入与输出的函数关系为ydata F x xdata 但不知道系
  • 新手做短视频自媒体,还在为做什么领域发愁?这里有没有你喜欢的

    很多新手小白都会遇到这样的情况 一看到镜头就紧张 脸红 说不出话来 或者没有什么才艺 又没有颜值 但也想通过做短视频自媒体赚钱 今天大周给你们推荐几个新手不用露脸也能做的短视频领域 可以选一个自己喜欢或合适自己的去尝试一下 一 音乐领域 1
  • 【FPGA内部RAM原理及应用场景分析】- 从内部RAM简介、分类、存储器方式以及不同场景下的应用四个方面来详细阐述FPGA内部RAM的原理和应用。

    FPGA内部RAM原理及应用场景分析 从内部RAM简介 分类 存储器方式以及不同场景下的应用四个方面来详细阐述FPGA内部RAM的原理和应用 FPGA内部RAM简介 FPGA内部RAM是一种集成在FPGA芯片内部的存储器 它可以用于高速数据
  • cuihua 2022.4.11-17BUU刷题记录

    25 MRCTF2020 摇滚DJ 1 题目概述 2 解题过程 听了一下 真难听 audacity打开 波形是平的 和前面那道题有点像 kali的qsstv工具 安装qsstv apt install qsstv 安装成功后 在终端下输入q
  • pytorch: 网络权重初始化

    构建完网络后 往往需要初始化权重 其实也可以不需手动初始化 在声明网络时 pytorch有默认的初始化方式 如 import torch x torch Tensor 2 2 print x 输出为 tensor 2 0363e 09 4
  • SQL之sqli-labs注入Less-2~4

    一 Less 2 与Less 1相同 我们同样使用 id 1 看是否可以注入 发现不可以 并且提示错误 我们可以知道 这里不需要引号 这就是与Less 1不同的地方 除此之外 以下步骤与Less 1相同 2 接下来我们使用 order by
  • PHP数据接收和使用

    接受来自js发送的数据 有几种接收方式 1 GET u GET user 2 POST P POS 3 REQUEST 两种传输方式的数据都可以接收 q REQUEST 创建虚拟服务器完成后操作 数据表格的方法 链接数据库 link new
  • springboot启动报错Error creating bean with name requestMappingHandlerMapping defined in class path resou

    springboot启动报错 Error creating bean with name requestMappingHandlerMapping defined in class path resource org springframe
  • python 批量读取txt文件

    1 python 批量读取txt文件 不读 注释的部分 并将数据保存为dataframe格式 代码 import re import glob import pandas as pd path data txt 指定txt文件所在文件夹路径
  • java如何正常关闭一个线程

    如何关闭一个线程 调用stop方法 该方法存在一个问题 JDK官方不推荐使用 该方法在关闭线程时可能不会释放掉monitor的锁 所以建议不要使用该方法结束线程 正常关闭 2 1 线程正常结束生命周期 线程运行结束 完成自己的使命之后 就会
  • 终于拿下腾讯25K的offer,面试官问我的面试题+回答,他都听懵了...

    前言 自动化测试面试题总结 1 你会封装自动化测试框架吗 这个问得最多 很多公司直接写在招聘要求中 自动化框架主要的核心框架就是分层 PO模式 分别为 基础封装层BasePage PO页面对象层 TestCase测试用例层 然后再加上日志处
  • 人们对刷脸支付便捷安全性的需求提升

    众所周知支付宝的领先依附于阿里系在线上电商领域的绝对优势地位 而微信支付却能凭借微信10亿的月活用户在线下支付披荆斩棘 在过去几年 移动支付的飞速发展带动了支付技术的变革 而人脸识别技术的成熟和人们对支付便捷安全性需求的提升 使得刷脸支付逐
  • 顺序表的冒泡排序算法及二分法查找代码实现

    本文主要实现了比较经典的冒泡排序算法 对已经有序或者基本有序的顺序表复杂度大大降低 和二分法查找 各位看官看代码吧 冒泡排序算法及二分法查找 include stdio h typedef struct int key SSTable El
  • pycharm注释快捷键

    选中需要注释的区域 ctrl 单行和多行皆可 当行则不需要选中 放在需要注释的那一行 点击 ctrl 即可 取消注释也是Ctrl
  • Python tips: 什么是*args和**kwargs?

    Python tips 什么是 args和 kwargs 先来看个例子 def foo args kwargs print args args print kwargs kwargs print if name main foo 1 2 3
  • 信息系统安全(对称加密)-软件设计(三十一)

    计算机网络 计算子网掩码 下 软件设计 三十 https blog csdn net ke1ying article details 129655795 安全属性 保密性 完整性 可用性 不可抵赖性 保密性 最小授权原则 防暴露 信息加密
  • 终于有人把“TCC分布式事务”实现原理讲明白了!

    之前网上看到很多写分布式事务的文章 不过大多都是将分布式事务各种技术方案简单介绍一下 很多朋友看了还是不知道分布式事务到底怎么回事 在项目里到底如何使用 所以这篇文章 就用大白话 手工绘图 并结合一个电商系统的案例实践 来给大家讲清楚到底什
  • 队列系列篇——数组模拟

    基本介绍 数组模拟队列 代码实现 package com wustyq queue import java util Scanner ClassName ArrayQueueDemo br Description br date 2021