【数据结构与算法】(JAVA版)队列,使用普通数组模拟队列(应用场景:银行预约叫号系统),数组模拟环形队列

2023-05-16

内容非常详细,不懂请耐性看完,关键步骤都有注释

队列Queue

普通数组模拟队列

/**

  • 队列应用场景:银行预约叫号系统
  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 本代码使用数组模拟队列
  • 基本实现思想:
  • 当添加数据时,front不动,rear随着数据走
  • 当取出数据时,rear不动,front随着数据走
  • 出现问题:
  • 如:
  •  当列表中添加了3个元素之后,再向队列中将全部元素取出(方法是getQueue())之后。
    
  •  再向列表中添加数据就添加不了了
    
  • 为了解决这一问题,特此采用环形队列来处理
  • */

package dataStructure;
import java.util.Scanner;
public class Queue {
	public static void main(String[] args) {
		ArrayQueue arrayQueue = new ArrayQueue(3);
		char key = ' ';//接收用户输入
		Scanner sc = new Scanner(System.in);
		boolean loop = true;
		while(loop) {
			System.out.println("d(display):显示队列");
			System.out.println("a(add):添加数据到队列");
			System.out.println("e(exit):退出程序");
			System.out.println("g(get):从队列中取出数据");
			System.out.println("p(peek):查看队列头数据");
			key = sc.next().charAt(0);
			switch(key) {
				case 'a':
					System.out.println("输入一个数");
					int e = sc.nextInt();
					arrayQueue.addQueue(e);
					break;
				case 'd':
					arrayQueue.display();;
					break;
				case 'g':
					try {//如果方法getQueue没有抛出异常
						int res = arrayQueue.getQueue();
						System.out.printf("取出的数据是%d\n",res);
					}catch(Exception E) {//如果抛出异常
						System.out.println(E.getMessage());
					}
					break;
				case 'p':
					try {
						int res = arrayQueue.peekQueue();
						System.out.printf("队列头的数据是%d\n",res);
					}catch(Exception E) {
						System.out.println(E.getMessage());
					}
					break;
				case 'e':
					sc.close();
					loop = false;
					break;
				default:
					break;
			}	
		}
		System.out.println("程序退出");
	}
}
class ArrayQueue{
	private int maxSize;//表示数组的最大容量
	private int front;//对列头
	private int rear;//对列尾
	private int[] array;//模拟队列的数组
	//初始化构造器
	public ArrayQueue(int arrmaxSize){
		maxSize = arrmaxSize;
		front = -1;//队列头,front指向队列头的前一个位置
		rear = -1;//队列尾,指向队列尾的数据(即就是队列最后一个数据)
		array = new int[arrmaxSize];
	}
	//判空操作
	public boolean isEmpty() {
		return front == rear;
	}
	//判断队列是否已满
	public boolean isFull() {
		return rear == maxSize - 1;
	}
	//向队列添加数据
	public void addQueue(int e) {
		if(isFull()) {
			System.out.println("队列已满~~");
			return;
		}
		rear++;
		array[rear] = e;
	}
	//元素出队
	public int getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列中没有元素");
			//这里不用写return,因为异常抛出后自动结束本次方法调用
		}
		return array[++front];
	}
	//显示队列中所有元素
	public void display() {
		if(isEmpty()) {
			System.out.println("d队列中没有元素");
			return;
		}
		for(int i = 0;i < array.length;i++) {
			System.out.printf("array[%d]=%d\n",i,array[i]);
		}
	}
	//查看队列第一个元素
	public int peekQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列中没有元素");
		}
		return array[front + 1]; 
	}
}

数组模拟环形队列

/**

  • 思路如下:
    1. front变量的含义做一个调整: front 就指向队列的第一个元素 也就是说array[front]就是队列的第一个元素front的初始值=0
    2. rear变量的含义做一个调整: rear指向队列的最后一个元素的后一个位置.因为希望空出一个空间做为约定.rear的初始值=0
      3.当队列满时,条件是(rear +1) %maxSize== front [满]
      4.对队列为空的条件,rear= front
      5.当我们这样分析,队列中有效的数据的个数(rear+ maxSize - front)% maxsize
  • */
package dataStructure;
import java.util.Scanner;
public class CircularQueue {
	public static void main(String[] args) {
		CircularArray arrayQueue = new CircularArray(3);
		char key = ' ';//接收用户输入
		Scanner sc = new Scanner(System.in);
		boolean loop = true;
		while(loop) {
			System.out.println("d(display):显示队列");
			System.out.println("a(add):添加数据到队列");
			System.out.println("e(exit):退出程序");
			System.out.println("g(get):从队列中取出数据");
			System.out.println("p(peek):查看队列头数据");
			System.out.println("请输入对应功能的字符");
			key = sc.next().charAt(0);
			switch(key) {
				case 'a':
					System.out.println("输入一个数");
					int e = sc.nextInt();
					arrayQueue.addQueue(e);
					break;
				case 'd':
					arrayQueue.display();;
					break;
				case 'g':
					try {//如果方法getQueue没有抛出异常
						int res = arrayQueue.getQueue();
						System.out.printf("取出的数据是%d\n",res);
					}catch(Exception E) {//如果抛出异常
						System.out.println(E.getMessage());
					}
					break;
				case 'p':
					try {
						int res = arrayQueue.peekQueue();
						System.out.printf("队列头的数据是%d\n",res);
					}catch(Exception E) {
						System.out.println(E.getMessage());
					}
					break;
				case 'e':
					sc.close();
					loop = false;
					break;
				default:
					break;
			}
				
		}
		System.out.println("程序退出");
	}
}
class CircularArray{
	private int maxSize;//表示数组的最大容量
	private int front;
	private int rear;
	private int[] array;//模拟队列的数组
	//初始化构造器
	public CircularArray(int arrmaxSize){
		maxSize = arrmaxSize;
		array = new int[arrmaxSize];
	}
	//判空操作
	public boolean isEmpty() {
		return front == rear;
	}
	//判断队列是否已满
	public boolean isFull() {
		return (rear+1) % maxSize == front;
	}
	//向队列添加数据
	public void addQueue(int e) {
		if(isFull()) {
			System.out.println("队列已满~~");
			return;
		}
		//直接将数据加入
		array[rear] = e;
		//rear后移一位,这里必须考虑取模
		rear = (rear+1) % maxSize;
	}
	//元素出队
	public int getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列中没有元素");
			//这里不用写return,因为异常抛出后自动结束本次方法调用
		}
		//这里需要分析front是指向队列的第一个元素
		//1.先把front对应的值保留到一个临时变量
		//2.将front后移,考虑取模
		//3.将临时保存的变量返回
		int value = array[front];
		front = (front+1) % maxSize;
		return value;
	}
	//显示队列中的所有数据
	public void display() {
		if(isEmpty()) {
			System.out.println("d队列中没有元素");
			return;
		}
		//从front开始遍历,再算出有效数据个数
		for(int i = front;i < front + size();i++) {
			System.out.printf("array[%d]=%d\n", i % maxSize,array[i%maxSize]);
		}
	}
	//求出当前队列有效数据个数
	public int size() {
		return (rear + maxSize - front) % maxSize;
	}
	//显示队列的第一个元素,不是取出是查看
	public int peekQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列中没有元素");
		}
		return array[front]; 
	}
	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构与算法】(JAVA版)队列,使用普通数组模拟队列(应用场景:银行预约叫号系统),数组模拟环形队列 的相关文章

  • 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信

    文章目录 前言一 ESP8266模块与STM32连接二 单片机代码三 总结 前言 承接上文WIFI上位机部分 xff1a 上位机 通过WIFI上位机与网络调试助手通信绘制曲线 xff0c 现阶段实现了STM32单片机与ESP8266WIFI
  • Linux C++服务器项目——项目实战1(理论知识)

    牛客 C 43 43 高并发服务器开发 参考笔记 1 阻塞 非阻塞 同步 异步 网络lO 2 Unix Linux上的五种lO模型a 阻塞blockingb 非阻塞non blocking NIO c IO复用 IO multiplexin
  • 网络编程传输层——UDP通信

    何为传输层 xff1f 在物理层 数据链路层 网络层解决了主机和主机之间能够发送接收数据 xff0c 但是在计算机网络中 xff0c 主机的通信主体还是进程 xff0c 而传输层则解决应用进程的通信 xff0c 所谓传输层协议也是端对端协议
  • WiFi的原理以及正点原子WiFi模块的使用

    本文主要用于记录WiFi的部分协议 原理 xff0c 以及如何使用正点原子的WiFi模块 文章名 xff1a WiFi的原理以及正点原子WiFi模块的使用 作者 xff1a 遮瑕 注 xff1a 本文大量引用 WIFI基本知识整理 以及百度
  • STM32 - 用户自定义通讯协议

    一 自定义协议 帧头1 xff1a 0x5A 帧头1 xff1a 0xA5 命令类型 xff1a 0x01 ADC 读取电压 0x02 外部flash写入 0x03 外部flash 读取 0x04 内部flash 写入 0x05 内部fla
  • 串口通信介绍

    文章目录 1 串口通信简介 xff08 DB9接口讲解 xff09 2 串口通信基本原理 xff08 1 xff09 串口通信连线 xff08 2 xff09 串口通信时序 1 波特率 2 起始位 3 数据位 4 奇偶校验位 5 停止位 3
  • curl 命令详解(超详细)

    GET 请求 GET 方法是在 curl 中发出请求的默认方法 xff0c 因此不必指定任何参数 eg curl https blog ucwords com o 保存响应到文件中 curl o response tex https blo
  • Matlab 命令行显示循环显示进度条

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言一 代码二 简单说明三 测试总结 前言 闲来无事 xff0c 在用Matlab跑循环比较长的时候 xff0c 时间长 xff0c
  • Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 xff1a Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 霸道流氓气质的博客 CSDN博客 海康nv
  • C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?

    1 回答标题的问题 这里说下我自己的理解 xff0c 如有不正确请各位大佬斧正 想要解决这个问题需要先了解C 43 43 代码的编译过程 C 43 43 将代码编译生成可执行文件的过程可以分为三步 xff1a 预编译 编译 链接 预编译时
  • 加速度计、陀螺仪工作原理

    加速度计 陀螺仪的工作原理 参考链接 xff1a https c miaowlabs com B07 html 陀螺仪 加速度计都是惯性测量元件的一种 而 MPU 6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件 1 加
  • VsCode中运行C/C++

    VsCode中运行C C 43 43 1 插件 runCode2 配置环境 mingw64 1 插件 runCode 在 VsCode 中的扩展商店中 xff0c 下载插件 Code Runner 安装完成之后 xff0c 进行一些配置更改
  • 常见通信协议之UART、RS485

    UART 通用异步收发器一种通用的串行 异步通信总线 xff0c 该总线有两条数据线 xff0c 可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质 高低电信号并行通信 一次性传输多个位 布线难度高 存在数据干扰串行通信 逐次
  • java的琐碎学习之串口通信与数据库与GUI

    RFID作业 xff0c 要求实现软硬结合 xff0c 全部使用自己的页面完成 xff1b 找了几个教程发现安卓我做不到 xff0c 就用了Java实现 xff1b 图书管理系统 可以通过写卡来绑定15693卡和书籍 xff0c 实现增删改
  • C++- #define 和 const 有什么区别?

    回答如下 xff1a 定义不同 xff1a define 是C 43 43 预处理器的指令 xff0c 用于定义宏 xff0c const是C 43 43 关键字 xff0c 用于定义常量 作用对象不同 xff1a define 定义的宏
  • HTTP协议:二.使用工具观察 HTTP 的请求和响应

    二 使用工具观察 HTTP 的请求和响应 1 HTTP 协议格式 HTTP 是一个文本格式的协议 可以通过 Chrome 开发者工具或者 Fiddler 抓包 分析HTTP 请求 响应的细节 2 抓包工具的下载和使用 直接去官网下载即可 f
  • Linux环境下的c语言编程

    vim编辑器编辑hello c vim编辑器中输入相应代码 编译 运行代码 运行结果 使用GDB函数调用 编译生成可执行文件 启动gdb 第十行设置断点并运行 gcc过程改为makefile管理 编写makefile文件 启动makefil
  • ubuntu下关于ssh远程和scp远程复制文件以及nfs搭建

    SSH远程 在Linux系统中 xff0c 通过客户端连接到远程服务器中 xff0c 方便代码地编写运行 xff0c ssh是一种安全协议 xff0c 主要用于给远程登录信息数据进行加密 1 安装ssh 2 启动ssh 3 创建要发送的文件
  • Linux环境下的多线程&多进程编程

    1 线程的创建与终止 创建一个 c文件 xff0c 使用vi编辑器进行多线程的创建 编译文件 在编译文件时会出现对 pthread create 未定义的引用 xff0c 这是由于pthread 库不是Linux系统默认的库 xff0c 连
  • 东北天坐标系转载体坐标系

    文章目录 1 基本概念1 1欧拉角1 2左乘右乘1 3东北天坐标系1 4载体坐标系1 5捷联惯性导航系统 2 通过ECEF转换到参考点附近的ENU坐标系上3 东北天坐标系到载体坐标系 1 基本概念 1 1欧拉角 欧拉旋转定理指出 xff1a

随机推荐

  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI
  • Spring Boot基础学习之(六):前后端交互实现用户登录界面

    本次项目所有能够使用的静态资源可以免费进行下载 静态资源 本篇博客写的内容 xff0c 是一个系列 xff0c 内容都是关于spring boot架构的学习 xff0c 实现前后端交互 xff0c 极大的解放双手spring boot学习系
  • USMART调试组件

    什么是USMART USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具 具体工作过程是通过串口发送命令给单片机 然后单片机收到命令之后调用单片机里面对应的相关函数 并执行 同时支持返回结果 USM
  • 内部温度传感器

    STM32有一个内部的温度传感器 可以用来测量CPU及周围的温度 TA 该温度传感器在内部和ADCX IN16输入通道相连接 此通道把传感器输出的电压转换成数字值 温度传感器模拟输入推荐采样时间是17 1us STM32的内部温度传感器支持
  • 光敏传感器

    光敏传感器是利用光敏元件将光信号转换为电信号的传感器 它的敏感波长在可见光波长附近 包括红外线波长和紫外线波长 光传感器不只局限于对光的探测 它还可以作为探测元件组成其他传感器 对许多非电量进行检测 只要将这些非电量转换为光信号的变化即可
  • 网络基础应用层--HTTP协议

    网络基础应用层 HTTP协议 一 应用层协议 xff08 一 xff09 应用层协议概念 xff08 二 xff09 自定义协议概念 xff08 三 xff09 数据格式如何定义最优 xff08 四 xff09 结构体的二进制序列化 二 H
  • SPI接口原理与配置

    SPI接口简介 SPI是英语Serial Peripheral interface的缩写 顾名思义就是串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的 SPI是一种高速的 全双工 同步的通信总线 并且在芯片的管
  • DHT11温湿度传感器实验

    DHT11 是一款湿温度一体化的数字传感器 该传感器包括一个电阻式测湿元件和一个 NTC 测温元件 xff0c 并与一个高性能 8 位单片机相连接 通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度 DHT11 与单片机之间
  • 串口通讯的配置

    串口以及中断的配置 xff1a if EN USART1 RX 如果使能了接收 串口1中断服务程序 注意 读取USARTx gt SR能避免莫名其妙的错误 u8 USART RX BUF USART REC LEN 接收缓冲 最大USART
  • 485代码分析

    rs485 h ifndef RS485 H define RS485 H include 34 sys h 34 extern u8 RS485 RX BUF 64 接收缓冲 最大64个字节 extern u8 RS485 RX CNT
  • 【数据结构】手把手教你利用栈实现二进制转换成十进制(C语言)

    1 第一步创建一个栈 span class token macro property span class token directive keyword include span span class token string lt st
  • 【数据结构】数组的物理地址寻址

    一 xff1a 数组的类型定义 数组是有类型相同的数据元素的有序集合 二 xff1a 数组的顺序储存 数组为什么不采用链式存储结构 xff1f 1 xff1a 数据的结构固定 xff08 维数和维界不变 xff09 xff0c 也就是说一旦
  • 【数据结构与算法】数和二叉树基础题目练习详解

    1 xff0c 在一棵树中 xff0c 如果结点A有3个兄弟 xff0c 而且B是A的双亲 xff0c 则B的度是 xff08 xff09 解 xff1a B的度是4 2 xff0c 对于一棵具有n个结点的树 xff0c 该树中所有结点的度
  • 【数据结构】图的基础练习题目,及题解

    1 xff0c 有n个结点的无向图最多有 xff08 xff09 条边 xff0c 有向图最多有 xff08 xff09 条边 xff08 弧 xff09 解 xff1a n n 1 2 n n 1 无向图中两点之间连成一条直线 xff1b
  • 【数据结构与算法】(JAVA版)队列,使用普通数组模拟队列(应用场景:银行预约叫号系统),数组模拟环形队列

    内容非常详细 xff0c 不懂请耐性看完 xff0c 关键步骤都有注释 队列Queue 普通数组模拟队列 队列应用场景 xff1a 银行预约叫号系统队列是一个有序列表 xff0c 可以用数组或是链表来实现 本代码使用数组模拟队列基本实现思想