队列介绍

队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。

即:先存入队列的数据,要先取出。后存入的要后取出 示意图:(使用数组模拟队列示意图)

 数组模拟队列

队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。

因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,

如图所示:

当我们将数据存入队列时称为”addQueue”,

addQueue 的处理需要有两个步骤:

思路分析 将尾指针往后移:

  rear+1 , 当front == rear 【空】 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。

  rear == maxSize - 1[队列满] 代码实现 问题分析并优化

代码实现

package com.lin.queue_0131;

import java.util.Scanner;

public class Array_Queue {

    public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue(4);
Scanner scanner = new Scanner(System.in);
char c;
while(true) {
System.out.println("------------------------------");
System.out.println("|");
System.out.println("|");
System.out.println("------------------------------");
System.out.println("-1 s(show):显示队列, -2 e(exit):退出程序, -3 a(add):添加数据到队列, -4 g(get):获取队列的数据, -5 h(head):查看队列头数据 ");
System.out.println("请输入以上提示字符:");
c = scanner.next().charAt(0);
switch (c) {
case 's':
arrayQueue.showQueue();
break;
case 'e':
System.exit(0);
break;
case 'a':
System.out.println("请输入添加数据:");
int n = scanner.nextInt();
arrayQueue.addQueue(n);
break;
case 'g':
try {
System.out.println("出队:" + arrayQueue.getQueue());
} catch (NullQueueException e) {
System.err.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println("头数据:" + arrayQueue.headQueue());
} catch (NullQueueException e) {
System.err.println(e.getMessage());
}
break;
default:
break;
}
}
}
} class ArrayQueue{ private int fornt;
private int rear;
private int maxSize;
private int[] arr; // 创建队列构造器
public ArrayQueue(int maxSize){
this.arr = new int[maxSize];
this.maxSize = maxSize;
this.rear = -1; // 指向队尾的数据
this.fornt = -1; // 指向队列头的前一位置
} // 判断队列是否已满
public boolean isFull() {
return rear == (maxSize - 1);
} // 判断队列是否为空
public boolean isEmpty() {
return rear == fornt;
} // 入队
public void addQueue(int n) {
if(!isFull()) {
arr[++rear] = n;
System.out.println("添加成功!");
} else {
System.out.println("队列已满!");
}
} // 出队
public int getQueue() throws NullQueueException {
if(isEmpty()) {
throw new NullQueueException("队列为空!"); // 自定义异常
}
int arrNum = arr[++fornt];
arr[fornt] = 0;
return arrNum; } // 遍历队列
public void showQueue() {
if(isEmpty()) {
System.out.println("队列为空,无法输出数据!");
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print("arr[" + i + "] = " + arr[i] + "\t");
}
System.out.println();
} // 显示队列的头数据
public int headQueue() throws NullQueueException {
if(isEmpty()) {
throw new NullQueueException("队列为空!"); // 自定义异常
}
return arr[fornt +1];
}
}
注意:没有优化的代码数组只能用一次,即使队列为空,也无法添加数据。

优化后的代码
环形队列调整思路(其中的一种办法):
front变量的含义:front指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,之前的front是指向队列头元素的前一个位置。初始值为0。
rear变量的含义:rear指向队列的最后一个元素的后一个位置。希望空出一个空间作为约定。初始值为0。
当队列满时,条件是(rear + 1)%maxSize == front。
当队列为空时,条件是rear == front。
有效个数:(rear + maxSize - front)%maxSize。

package com.lin.queue_0131;

import java.util.Scanner;

public class ArrayQueuePuls {

    public static void main(String[] args) {
ArrayQueue2 arrayQueue2 = new ArrayQueue2(4);
Scanner scanner = new Scanner(System.in);
char c;
while(true) {
System.out.println("------------------------------");
System.out.println("|");
System.out.println("|");
System.out.println("------------------------------");
System.out.println("-1 s(show):显示队列, -2 e(exit):退出程序, -3 a(add):添加数据到队列, -4 g(get):获取队列的数据, -5 h(head):查看队列头数据,-1 printFornt,-2 printRear ");
System.out.println("请输入以上提示字符:");
c = scanner.next().charAt(0);
switch (c) {
case 's':
arrayQueue2.showQueue();
break;
case 'e':
System.exit(0);
break;
case 'a':
System.out.println("请输入添加数据:");
int n = scanner.nextInt();
arrayQueue2.addQueue(n);
break;
case 'g':
try {
System.out.println("出队:" + arrayQueue2.getQueue());
} catch (NullQueueException e) {
System.err.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println("头数据:" + arrayQueue2.headQueue());
} catch (NullQueueException e) {
System.err.println(e.getMessage());
}
break;
case '1':
arrayQueue2.printFront();
break;
case '2':
arrayQueue2.printRear();
break;
default:
break;
}
}
} }
class ArrayQueue2{ private int fornt;
private int rear;
private int maxSize;
private int[] arr; // 创建队列构造器
public ArrayQueue2(int maxSize){
this.arr = new int[maxSize];
this.maxSize = maxSize;
this.rear = 0; // 指向队尾的数据
this.fornt = 0; // 指向队列头的前一位置
} // 判断队列是否已满
public boolean isFull() {
return (rear + 1)%maxSize == fornt;
} // 判断队列是否为空
public boolean isEmpty() {
return rear == fornt;
} // 入队
public void addQueue(int n) {
if(!isFull()) {
arr[rear] = n;
rear = (rear + 1)%maxSize;
System.out.println("添加成功!");
} else {
System.out.println("队列已满!");
} } // 出队
public int getQueue() throws NullQueueException {
if(isEmpty()) {
throw new NullQueueException("队列为空!"); // 自定义异常
}
int arrNum = arr[fornt];
fornt = (fornt + 1)%maxSize;
return arrNum; } // 遍历队列
public void showQueue() {
if(isEmpty()) {
System.out.println("队列为空,无法输出数据!");
return;
}
for (int i = fornt; i < fornt + numSize(); i++) {
System.out.print("arr[" + i%maxSize + "] = " + arr[i%maxSize] + "\t");
}
System.out.println();
} public int numSize() {
return (rear + maxSize - fornt)%maxSize; // (rear + maxSize - fornt)%maxSize环形队列元素的实际个数
}
// 显示队列的头数据
public int headQueue() throws NullQueueException {
if(isEmpty()) {
throw new NullQueueException("队列为空!"); // 自定义异常
}
return arr[fornt];
}
public void printFront() {
System.out.println(this.fornt);
}
public void printRear() {
System.out.println(this.rear);
}
}

虽然数组size为4,但容量只有3

最后,fornt单词写错了,应该是front。

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

Java数组模拟队列 + 优化的更多相关文章

  1. Java数组模拟队列

    队列 先进先出 什么意思呢? 我的理解:队列就是一个数组(不包含链表),然后我们给它施加一个存数据和取数据的规则 当只允许从一端存数据,从另一端取数据的数组,就是队列,我们要做的就是给这个数组施加我们 ...

  2. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  3. php中数组模拟队列、栈的函数以及数组指针操作

    1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...

  4. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  5. Java数组模拟栈

    一.概述 注意:模拟战还可以用链表 二.代码 public class ArrayStack { @Test public void test() { Stack s = new Stack(5); ...

  6. Java数组模拟环形队列

    2.环形队列 (上一篇队列:https://www.cnblogs.com/yxm2020/p/12676323.html) 百度百科 1.假溢出 ​ 系统作为队列用的存储区还没有满,但队列却发生了溢 ...

  7. java数组实现队列

    数组队列 用数组实现的队列,也叫循环队列.就是定义一个数组,用两个下标head,tail表示队头和队尾.当队头和队尾相等时,队列为空.当队尾+1等于队头时,队列为满. 注意tail的值,当插入一个元素 ...

  8. 用java数组模拟登录和注册功能

    package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...

  9. 用java数组模拟购物商城功能与实现

    实体类1(商品): package mall.model; public class goods { private int shoppingID; // 商品编号 private String sh ...

随机推荐

  1. 解决FastJson循环引用的问题

    temp 本来被循环引用,运行方法报错. 解决方法:对temp进行处理 SerializerFeature feature = SerializerFeature.DisableCircularRef ...

  2. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

  3. Mysql性能监控可视化

    前言 ​ 操作系统以及Mysql数据库的实时性能状态数据尤为重要,特别是在有性能抖动的时候,这些实时的性能数据可以快速帮助你定位系统或Mysql数据库的性能瓶颈,镜像你在Linux系统上使用top.i ...

  4. Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)

    // golang中是没有判断字符串是否存在数组或切片里的内置方法, 所以我们可以自己搞一个快速小组件 func Find(slice []string, val string) (int, bool ...

  5. 在Termux(非root的安卓Linux模拟器)中安装和使用ftp服务器(pure-ftpd)(原创)[简单极致]

    Termux是单用户的linux模拟器,所以应用的专属文件夹下面.usr/etc/下面没有passwd和group文件对多用户组配置,只在.usr/bin/下面有passwd二进制应用可以改变当前用户 ...

  6. 基于nginx实现web服务器的双机热备

    1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...

  7. PHP 导入Excel数据 到数据库

    /** * 导入excel * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception */ public function ...

  8. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  9. FastApi 进阶

    前言 终于有了第一个使用 FastApi 编写的线上服务, 在开发的过程中还是遇到了些问题, 这里记录一下 正文 目录结构 我们知道, FastApi 的启动方式推荐使用 uvicorn, 其启动方式 ...

  10. 【SpringBoot1.x】SpringBoot1.x 任务

    SpringBoot1.x 任务 文章源码 异步任务 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的.但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使 ...