Java 队列

news2024/9/22 13:26:16

基本介绍

 数组模拟队列

思路分析

 代码实现

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 创建一个队列
        ArrayQueue queue = new ArrayQueue(3);
        int select;
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;

        while (loop) {
            System.out.println("\n----------队列操作菜单-----------");
            System.out.println("1、查看队列");
            System.out.println("2、添加数据到队列");
            System.out.println("3、取出队列元素");
            System.out.println("4、退出菜单");
            System.out.println("请选择:");

            select = scanner.nextInt();
            switch (select) {
                case 1: {
                    queue.showQueue();
                    break;
                }
                case 2: {
                    System.out.println("请输入要添加的数据(数字类型):");
                    int data = scanner.nextInt();
                    queue.pushQueue(data);
                    break;
                }
                case 3: {
                    try {
                        int data = queue.popQueue();
                        System.out.println("队头元素为:" + data);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                }
                case 4: {
                    loop = false;
                    break;
                }
            }
        }
        scanner.close();
    }
}

// 用数组模拟队列
class ArrayQueue {
    private int maxSize; // 队列的最大容量
    private int front; // 队头指针
    private int rear; // 队尾指针
    private int[] queue; // 队列,用于存储数据,此处用数组模拟

    ArrayQueue(int maxSize) {
        // 初始化数据
        this.maxSize = maxSize;
        // 根据 maxSize 创建一个队列
        this.queue = new int[maxSize];
        // 初始让队头队尾为 -1
        this.front = -1; // front 指向队头的前一个位置,若为 0 则指向队头那一个位置
        this.rear = -1; // rear 指向队尾的位置
    }

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

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

    // 入队
    public void pushQueue(int data) {
        // 先判断队列是否满了
        if (isFull()) {
            System.out.println("队列已满,不能添加数据了");
            return;
        }
        rear++; // 移动队尾指针,指向后一个空的位置
        queue[rear] = data; // 向该空的位置添加数据,此时 rear 依旧指向队尾最后一个数据
    }

    // 出队
    public int popQueue() {
        // 先判断队列是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空,不能获取数据");
        }
        // 此时 front 指向后一个位置,该位置是要被取出数据的位置
        // 数据取出后相当于队列移除该数据了,所以 front 仍然指向队头位置的前一个位置
        front++;
        return queue[front];
    }

    // 打印队列
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队列为空...");
            return;
        }
        System.out.println("队列元素为:");
        for (int i = front + 1; i <= rear; i++) {
            System.out.printf(queue[i] + "\t");
        }
        System.out.println();
    }
}

数组模拟环形队列

在上一个实现中,数组使用一次就不能再使用,没有达到复用效果,造成空间的浪费。

思路分析

代码实现

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 创建一个队列
        // 因为有一个位置是用于判断队列是否为满,即不存储具体数据,所以实际队列容量为 4-1=3
        CircleArrayQueue queue = new CircleArrayQueue(4);
        int select;
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;

        while (loop) {
            System.out.println("\n----------队列操作菜单-----------");
            System.out.println("1、查看队列");
            System.out.println("2、添加数据到队列");
            System.out.println("3、取出队列元素");
            System.out.println("4、退出菜单");
            System.out.println("请选择:");

            select = scanner.nextInt();
            switch (select) {
                case 1: {
                    queue.showQueue();
                    break;
                }
                case 2: {
                    System.out.println("请输入要添加的数据(数字类型):");
                    int data = scanner.nextInt();
                    queue.pushQueue(data);
                    break;
                }
                case 3: {
                    try {
                        int data = queue.popQueue();
                        System.out.println("队头元素为:" + data);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                }
                case 4: {
                    loop = false;
                    break;
                }
            }
        }
        scanner.close();
    }
}

// 用数组模拟环形队列
class CircleArrayQueue {
    private int maxSize; // 队列的最大容量
    // front 指向队列的第一个元素,也就是说 queue[front] 就是队列的第一个元素
    // front 的初始值为 0
    private int front; // 队头指针
    // rear 指向队列的最后一个元素的后一个位置,因为希望空出一个位置作为判断队列是否为满的标志
    // rear 的初始值为 0
    private int rear; // 队尾指针
    private int[] queue; // 队列,用于存储数据,此处用数组模拟

    CircleArrayQueue(int maxSize) {
        // 初始化数据
        this.maxSize = maxSize;
        // 根据 maxSize 创建一个队列
        this.queue = new int[maxSize];
        // 初始让队头队尾为 0,也可以不写,因为成员变量默认值就是为 0
        this.front = 0;
        this.rear = 0;
    }

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

    // 队列判满
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    // 入队
    public void pushQueue(int data) {
        // 先判断队列是否满了
        if (isFull()) {
            System.out.println("队列已满,不能添加数据了");
            return;
        }

        // 因为 rear 本身就指向队列最后一个元素的后一个位置,所以可以直接将数据加入
        queue[rear] = data;
        // 将 rear 后移,需要取模,因为可能数组前面是可利用的空间,把 rear 指向前面空的位置
        rear = (rear + 1) % maxSize;
    }

    // 出队
    public int popQueue() {
        // 先判断队列是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空,不能获取数据");
        }

        // front 指向队列的第一个元素
        // 先把 front 对应的值用一个临时变量存储
        // 将 front 后移,需要取模
        // 将临时变量返回
        int val = queue[front];
        front = (front + 1) % maxSize;
        return val;
    }

    // 打印队列
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队列为空...");
            return;
        }
        System.out.println("队列元素为:");
        int size = queueSize();
        for (int i = front; i < front + size; i++) {
            System.out.printf(queue[i % maxSize] + "\t");
        }
        System.out.println();
    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块14

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

MySQL基础(四)数据库备份

目录 前言 一、概述 1.数据备份的重要性 2.造成数据丢失的原因 二、备份类型 &#xff08;一&#xff09;、物理与逻辑角度 1.物理备份 2.逻辑备份 &#xff08;二&#xff09;、数据库备份策略角度 1.完整备份 2.增量备份 三、常见的备份方法 四、备份&#xff08…

“嵌入式开发:多元化就业,职业发展广阔“

嵌入式开发是一个发展迅速、就业前景广阔的领域。在各行各业的电子产品中&#xff0c;嵌入式应用无处不在&#xff0c;为智能化提供关键支持。作为嵌入式工程师&#xff0c;你将有广泛的就业机会。 你可以涉足消费电子、安全安防、汽车电子、医疗电子、电信等多个行业的计算机…

SSIS对SQL Server向Mysql数据转发表数据 (完结)

1、对于根据主键进行更新和插入新的数据&#xff0c;根据前面的文章&#xff0c;对于组件已经很熟悉了&#xff0c;我们直接加入一个 查找 组件 &#xff0c;如下所示 2、右键点击"查找"&#xff0c;然后“编辑” &#xff0c;选择“连接”,选中我们的目标连接器&…

独立站最全出单营销指南,新手卖家赶紧学起来吧!

这是一个需要投入大量时间和精力的挑战&#xff0c;但只有经过筛选在众多品牌和渠道中找到最适合自己的营销策略&#xff0c;才能成功。 新手商家经常会发现自己有很多可以改进的地方&#xff1a;品牌的颜色、字体以及其他一些细节。但真正走向成熟的商家会意识到&#xff0c;…

cv2抛出异常 “install libgtk2.0-dev and pkg-config, then re-run cmake or configure”

背景&#xff1a; linux中使用cv2显示图片的时候&#xff0c;运行提示异常&#xff1a; 处理方式&#xff1a; 网友的推荐操作&#xff1a; 切换至root模式安装 apt-get install libgtk2.0-dev进入OpenCV下载目录&#xff0c;重新编译 cd /home/XXX/opencv mkdir release …

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界&#xff0c;我们被图像和视频所包围。从社交媒体到广告&#xff0c;图像已成为一种强大的交流媒介。但是你有没有想过&#xff0c;如果你能把你的照片变成卡通会发生什么&#xff1f;想象一下&#xff0c;为您最喜欢的照片创建动画版本&#xf…

MOS管可以双向流过电流吗

在大多数MOS管电路中&#xff0c;对于NMOS管&#xff0c;电流方向一般是从漏极到源极&#xff0c;对于PMOS管&#xff0c;电流方向一般是从源极到漏极。 那么MOS管可以反向流过电流吗&#xff1f;也就是NMOS管电流从源极到漏极&#xff0c;PMOS管电流从漏极到源极。 为了弄清这…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

常见内网穿透工具,收好了!

前言 本文以渗透的视角&#xff0c;总结几种个人常用的内网穿透&#xff0c;内网代理工具&#xff0c;介绍其简单原理和使用方法。 1. nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协…

解密 CryptBot 窃密软件

CryptBot 是一种针对 Windows 操作系统进行信息窃取的恶意软件&#xff0c;在 2019 年被首次发现。它旨在窃取失陷主机的敏感信息&#xff0c;例如浏览器凭据、加密货币钱包、浏览器 Cookie、信用卡信息与屏幕截图等。 恶意软件简介 沙盒动态分析 样本启动时会创建一个进程&…

什么是SD NAND存储芯片

前言 大家好&#xff0c;我们一般在STM32项目开发中或者在其他嵌入式开发中&#xff0c;经常会用到存储芯片存储数据。今天我和大家来介绍一款存储芯片&#xff0c;我这里采用&#xff08;雷龙&#xff09; CS创世 SD NAND 。 SD NAND介绍 什么是SD NAND&#xff1f;它俗称贴…

Linux安装部署Nacos和sentinel

1.将nacos安装包下载到本地后上传到linux中 2.进入nacos的/bin目录,输入命令启动nacos [rootlocalhost bin]# sh startup.sh -m standalone注:使用第二种方式启动,同时增加日志记录的功能 2.2 startup.sh文件是不具备足够的权限,否则不能操作 给文件赋予执行权限 [rootlocalh…

记录Selenium自动化测试过程中接口的调用信息

上一篇博客&#xff0c;我写了python自动化框架的一些知识和粗浅的看法&#xff0c;在上一篇中我也给自己提出一个需求&#xff1a;如果记录在测试过程中接口的调用情况&#xff1f;提出这个需求&#xff0c;我觉得是有意义的。你在测试过程中肯定会遇到一些莫名其妙的问题&…

怎样计算一个算法的复杂度?

分析一个算法主要看这个算法的执行需要多少机器资源。在各种机器资源中&#xff0c;时间和空间是两个最主要的方面。因此&#xff0c;在进行算法分析时&#xff0c;人们最关心的就是运行算法所要花费的时间和算法中使用的各种数据所占用的空间资源。算法所花费的时间通常称为时…

51单片机--红外遥控

文章目录 红外遥控的介绍硬件电路NEC编码外部中断红外遥控实例代码 红外遥控的介绍 红外遥控是一种无线、非接触控制技术&#xff0c;通过使用红外线来传送控制信号。它具有抗干扰能力强、信息传输可靠、功耗低、成本低、易实现等显著优点&#xff0c;因此被广泛应用于各种电子…

数据库的分库分表shell脚本

通过嵌套循环实现 #! /bin/bashback_user"-uroot -pRoot12345." back_dir/backup/one #获取数据库名 mysql ${back_user} -N -e show databases | grep -Ev sys|mysql|information_schema|performance_schema > dbswhile read dbname do[ -d ${back_dir}/$dbnam…

openEuler 22.03 LTS系统搭建局域网上网代理服务器

生产网环境的一个痛点就是与外网隔离&#xff0c;内网的服务器如果需要进行补丁升级或者下载更新软件&#xff0c;比较困难&#xff0c;本文讲解在生产网中能访问公网的openEuler 22.03 LTS系统服务器上搭建代理服务器&#xff0c;供内网其它服务器连接公网&#xff0c;同时介绍…

海尔设计借助亚马逊云科技生成式AI,实现端到端的云上工业设计解决方案

海尔创新设计中心&#xff08;以下简称海尔设计&#xff09;成立于1994年&#xff0c;目前拥有400多名设计师&#xff0c;为海尔智家旗下七大品牌全球的所有产品提供设计创新和模式探索。亚马逊云科技为海尔设计提供了四个完整的云上解决方案&#xff0c;全面替代自有机房&…

Java019-1——面向对象的三大特性

一、封装性 将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问。&#xff08;这里说的信息就是类中的属性和方法&#xff09; 1.1、封装性的体现 想要通过代码体现封装性之前&#xff0c;需要先…