数据结构-队列java实现

队列

  • 队列(queue)
    • 1.队列的特点
    • 2.数组模拟队列JAVA代码
    • 3.上述过程优化

博文主要是自己学习的笔记,供自己以后复习使用,
参考的主要教程是B站的
尚硅谷数据结构和算法

队列(queue)

1.队列的特点

1)队列是一个有序列表,可以用数组或者链表来实现
2)遵循先进先出的原则:先存入队列的数据,要先取出。
用数组模拟队列的示意图:
在这里插入图片描述
初始化:rear=front=-1,都指向队列的前一个元素
入队:rear++
出队:front++
判空:rear==front
判满:rear = maxSize - 1

2.数组模拟队列JAVA代码

class ArrayQueue {private int maxSize;//最大容量private int front;//队列头private int rear;//队列尾private int[] arr;//存放数组//创建队列的构造器public ArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];front = -1;rear = -1;}//判断队列是否已满public boolean isFull() {return rear == maxSize - 1;}//判断队列是否为空public boolean isEmpty() {return rear == front;}//添加数据到队列public void addQueue(int data) {if (isFull()) {System.out.println("队列已满");} else {rear++;arr[rear] = data;}}//获取队列的数据,出队列public int getQueue() {if (isEmpty()) {//通过抛出异常throw new RuntimeException("队列为空");} else {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];}
}

测试代码

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 data = scanner.nextInt();arrayQueue.addQueue(data);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;}}}
}

3.上述过程优化

上述代码存在问题:
队列不管是存还是取都是++操作,因此上述队列只能用一次
**优化手段:**改为环形的队列,利用取模的操作实现。

初始化:rear=front=0,front指向当前元素,rear指向当前元素的后一个位置,空出一个空间作为约定
入队:rear = (rear+1)%maxSize
出队:front= (front+1)%maxSize
判空:rear==front
判满:(rear+1)%maxSize = front
有效数据个数(rear - front + maxSize) % maxSize
JAVA代码实现

class CircleArray {private int maxSize;private int front;private int rear;private int[] arr;public CircleArray(int maxSize) {this.maxSize = maxSize;rear = 0;front = 0;arr = new int[maxSize];}//判断队列是否已满public boolean isFull() {return (rear + 1) % maxSize == front;}//判断队列是否为空public boolean isEmpty() {return rear == front;}//添加数据到队列public void addQueue(int data) {if (isFull()) {System.out.println("队列已满");} else {arr[rear] = data;rear = (rear + 1) % maxSize;}}//获取队列的数据,出队列public int getQueue() {if (isEmpty()) {//通过抛出异常throw new RuntimeException("队列为空");} else {int temp = arr[front];front = (front + 1) % maxSize;return temp;}}//显示队列的所有数据public void showQueue() {//遍历if (isEmpty()) {System.out.println("队列空,没有数据~~~");return;}for (int i = front; i < front +size(); i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}//显示队列的头数据,注意不是取数据public int headQueue() {if (isEmpty()) {throw new RuntimeException("队列为空~~~");}return arr[front];}//显示队列的头数据,注意不是取数据public int size() {return (rear - front + maxSize) % maxSize;}
}

测试代码

public class CircleArrayQueueDemo {public static void main(String[] args) {//测试CircleArray arrayQueue = new CircleArray(4);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 data = scanner.nextInt();arrayQueue.addQueue(data);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;}}}
}

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

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

相关文章

集成学习 | 集成学习思想:Bagging思想

目录 一. Bagging思想1. Bagging 算法2. 随机森林(Random Forest)算法 在正文开始之前&#xff0c;我们先来聊一聊什么是集成学习&#xff1f; 集成学习是一种算法思想&#xff1a;将若干个弱学习器分组之后&#xff0c;产生一个新的学习器 弱学习器指预测误差在50%以下的学习器…

计算机组成原理 第五章(计算机的运算方法)—第五节(浮点四则运算)

写在前面&#xff1a; 本系列笔记主要以《计算机组成原理&#xff08;唐朔飞&#xff09;》为参考&#xff0c;大部分内容出于此书&#xff0c;笔者的工作主要是挑其重点展示&#xff0c;另外配合下方视频链接的教程展开思路&#xff0c;在笔记中一些比较难懂的地方加以自己的…

c++实现简单搜索二叉树<K,V>形

文章目录 搜索二叉树节点类BSTreeNode(节点类的构造) BSTree(功能实现类)Insert(插入)Erase(删除)Find(查找这个节点) 搜索二叉树 搜索二叉树本质:左节点比我小 右节点比我大 节点类 BSTreeNode:给自身节点封装一个类 用这个类来添加节点的操作 我们写的是一个key.value型的搜…

稀碎从零算法笔记Day19-LeetCode:相交链表

题型&#xff1a;链表基本操作 链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&…

vue3项目

案例用到的知识点如下&#xff1a; ① vite 创建项目 ② 组件的封装与注册 ③ props ④ 样式绑定 ⑤ 计算属性 ⑥ 自定义事件 ⑦ 组件上的 v-model 效果如下图&#xff1b; 页面2 项目结构&#xff1a; 初始化项目 在终端运行以下的命令&#xff0c;初始化 vite 项目&#xf…

前端跨平台开发框架:简化多端开发的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

十四、Nacos源码系列:Nacos配置发布原理

目录 一、简介 二、加密处理 三、发布配置 3.1、插入或更新配置信息 3.2、发布配置数据变动事件 3.2.1、目标节点是当前节点 3.2.2、目标节点非当前节点 四、总结 一、简介 一般情况下&#xff0c;我们是通过Nacos提供的Web控制台登录&#xff0c;然后通过界面新增配置…

苹果Vision Pro官方应用商店(网页版)正式上线

该网站为用户提供了丰富多样的应用资源,包括娱乐、教育、健康、购物、工具等各种类型的应用和游戏。 1、Apps & Games Arcade:提供各种应用和游戏,包括最新推出的、热门的以及专门为Apple Vision Pro设计的应用和游戏。 2、What’s New:展示最新推出的应用和游戏,让…

第388场 LeetCode 周赛题解

A 重新分装苹果 排序 class Solution { public:int minimumBoxes(vector<int> &apple, vector<int> &capacity) {int s accumulate(apple.begin(), apple.end(), 0);sort(capacity.begin(), capacity.end(), greater<int>());int res 0;for (int c…

STM32系列——F103C8T6 控制SG90舵机(HAL库)

文章目录 一、舵机控制原理二、.CubeMX配置配置RCC、SYS、时钟树配置RCC配置SYS配置时钟树配置定时器产生PWM波形 Keil5代码接线图及效果如果您发现文章有错误请与我留言&#xff0c;感谢 一、舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲&#xff0c;该脉冲的高电平…

【MatLab】之:Simulink安装

一、内容简介 本文介绍如何在 MatLab 中安装 Simulink 仿真工具包。 二、所需原材料 MatLab R2020b&#xff08;教学使用&#xff09; 三、安装步骤 1. 点击菜单中的“附加功能”&#xff0c;进入附加功能管理器&#xff1a; 2. 在左侧的“按类别筛选”下选择Using Simulin…

基于Springboot+Redis+mysql实现的闲置二手交易网站管理系统

1.1 背景分析 二手商品是学生比较青睐的廉价商品&#xff0c;网站设计应着重突出实用和廉价。也有一部分消费者是淘宝者&#xff0c;他们对相中的商品有着急切的拥有欲望。网上交易的好学生提供一个供需平台&#xff0c;学生可以将自己不用的东西放在网上&#xff0c;也可在网…

通过更新路书当前坐标下marker的icon来展示沿途的风景

通过更新路书当前坐标下marker的icon来展示沿途的风景 1.效果图2.[工程链接](https://download.csdn.net/download/m0_61864577/88978866)3.需修改地方: 本文演示了如何通过百度地图的路书功能,展示途经的风景。定时缩放,既有全局路径,又有当前位置和运动轨迹;可以显示当前坐标…

力扣59. 螺旋矩阵 II

思路&#xff1a;此题思路就是绕圈遍历&#xff0c;全靠条件处理技巧&#xff0c;重点要清楚的就是循环不变量&#xff1a;左闭右开&#xff08;即拐弯处的一个数&#xff0c;留给第二行处理&#xff09; 以下是代码随想录的作者的一张图片&#xff0c;每次for循环&#xff0c;…

SQL的执行与优化

文章目录 MySQL查询原理与优化一、select语句的执行顺序二、join 的执行与优化1、驱动表 & 被驱动表2、Simple Nested Loop Join3、Index Nested Loop Join4、Block Nested Loop Join5、Hash Join6、join 优化小结 三、on 与 where 对比四、group by 的执行与优化1、group …

拜占庭将军问题相关问题

1、拜占庭将军问题基本描述 问题 当我们讨论区块链共识时&#xff0c;为什么会讨论拜占庭将军问题&#xff1f; 区块链网络的本质是一个分布式系统&#xff0c;在存在恶意节点的情况下&#xff0c;希望 整个系统当中的善良节点能够对于重要的信息达成一致&#xff0c;这个机…

设计模式 --3:装扮模式

结构图 代码 #include<iostream>using namespace std;class person { public:person() {};person(string name) { this->name name; }virtual void show() {cout << "装扮的:" << this->name << endl;} private:string name; }; //装…

C语言中,基本数据类型介绍

C语言当中各种数据类型的大小&#xff0c;首先要了解有哪些数据类型。 一 字符型&#xff1a; 整数&#xff08;字符&#xff09;类型存储大小值范围char1 字节-128 到 127 或 0 到 255&#xff08;2的8次方&#xff09;unsigned char1 字节0 到 255&#xff08;&#xff09;s…

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…

vim | 介绍vim以及配置vimrc文件

好像熟练使用vim 是玩linux 必修课 当然&#xff0c;初代玩家能在vim 完成编辑 并保存已是入门了&#xff0c;想当初在大学的时候&#xff0c;死活转不过来&#xff0c;玩不过来&#xff0c;甚至有些恐惧 但后来&#xff0c;弄清楚原理&#xff0c;反倒觉得简简单单已是完美了。…