文章目录

  • 队列简介
  • 数组模拟队列(无法复用)
  • 数组模拟环形队列(可复用)

队列简介

队列是一个有序列表,可以用数组或是链表来实现。

遵循先入先出的原则。即先存入队列的数据,先取出,后存入的后取出。

示意图:(使用数组模拟队列示意图)

有两个分别指向头部和尾部的“指针”。


数组模拟队列(无法复用)

1、实现思路

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

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

当我们将数据存入队列时称为addQueue,addQueue的处理需要有两个步骤:
①将尾指针往后移。
②若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear 所指的数组元素中,否则无法存入数据。

rear+1当front== rear[空]
rear==maxSize-1[队列满]

2、代码实现

①数组实现队列类

class ArrQueue {private int maxSize; //队列(数组)最大容量private int front; //指向队列头部private int rear; //指向队列尾部private int[] queue;//创造队列的构造器public ArrQueue(int maxSize){this.maxSize = maxSize;queue = new int[maxSize];front = -1; //其实是队列第一个元素的前一个索引rear = -1; //最后一个元素的索引}//判断是否满public boolean isFull(){return rear == maxSize - 1;}//判断是否空public boolean isEmpty(){return front == rear;}//添加元素public void addQueue(int n){if (isFull()){System.out.println("队列已经满了,无法添加!");return;}else {rear++;queue[rear] = n;}}//取出元素public int getQueue(){if (isEmpty()){throw new RuntimeException("队列为空,无元素可取!");}else {front++;return queue[front];}}//显示队列public void showQueue(){if (isEmpty()){System.out.println("队列为空,没有元素可显示!");return;}for (int i : queue){System.out.println(i);}}//显示头数据public void headQueue(){if (isEmpty()){throw new RuntimeException("队列为空,没有头数据!");}int i = front;System.out.println(queue[++i]);}}

②测试类

import java.util.Scanner;/*** @Author: Yeman* @Date: 2021-10-11-22:02* @Description:*/
public class ArrayQueueTest {public static void main(String[] args) {//创建一个队列ArrQueue arrQueue = new ArrQueue(3);//创建一个用户输入Scanner scanner = new Scanner(System.in);//创建一个功能菜单char key = ' ';boolean isShow = true;while (isShow){System.out.println("s:显示队列");System.out.println("a:添加数据");System.out.println("g:取出数据");System.out.println("h:显示头数据");System.out.println("e:退出程序");key = scanner.next().charAt(0);switch (key){case 's' :arrQueue.showQueue();break;case 'a' :System.out.println("请输入一个数:");int value = scanner.nextInt();arrQueue.addQueue(value);break;case 'g' :try {System.out.println(arrQueue.getQueue());} catch (Exception e) {e.printStackTrace();}break;case 'h' :try {arrQueue.headQueue();} catch (Exception e) {e.printStackTrace();}break;case 'e' :isShow = false;break;}}System.out.println("程序退出...");}
}

数组模拟环形队列(可复用)

对前面的数组模拟队列的优化,充分利用数组。将数组看做是一个环形的,即取出之后,有位置可以空出来添加。(通过取模的方式来实现即可)

分析说明:
①尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定。在作判断队列满的时候需要注意(rear+ 1) % maxSize== front [满]
②rear == front [空]

1、思路如下:
①front 变量的含义调整:front 指向队列的第一个元素, 也就是说arr[front]就是队列的第一个元素,front的初始值为0。
②rear 变量的含义调整:rear 指向队列的最后一个元素的后一个位置,因为希望空出一个空间做为约定,rear的初始值=0。
③当队列满时,条件是(rear + 1) % maxSize == front [满]
④对队列为空的条件是rear== front[空]
⑤当我们这样分析,队列中有效的数据的个数(rear + maxSize - front) % maxSize
⑥我们就可以在原来的队列上修改得到一个环形队列

2、代码实现

①数组实现环形队列类

class ArrQueue {private int maxSize; //队列(数组)最大容量private int front; //指向队列头部,队列第一个元素的索引private int rear; //指向队列尾部,队列最后一个元素的后一个索引private int[] queue;//创造队列的构造器public ArrQueue(int maxSize){this.maxSize = maxSize;queue = new int[maxSize];}//判断是否满public boolean isFull(){return (rear + 1) % maxSize == front;}//判断是否空public boolean isEmpty(){return front == rear;}//添加元素public void addQueue(int n){if (isFull()){System.out.println("队列已经满了,无法添加!");return;}else {queue[rear] = n;rear = (rear + 1) % maxSize;}}//取出元素public int getQueue(){if (isEmpty()){throw new RuntimeException("队列为空,无元素可取!");}else {int data = queue[front];front = (front + 1) % maxSize;return data;}}//显示队列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,queue[i % maxSize]);}}//求当前队列有效数据个数public int size(){return (rear + maxSize - front) % maxSize;}//显示头数据public void headQueue(){if (isEmpty()){throw new RuntimeException("队列为空,没有头数据!");}System.out.println(queue[front]);}}

②测试类

import java.util.Scanner;/*** @Author: Yeman* @Date: 2021-10-11-22:02* @Description:*/
public class ArrayQueueTest {public static void main(String[] args) {//创建一个队列ArrQueue arrQueue = new ArrQueue(3); //说明该环形队列的最大有效数据为2//创建一个用户输入Scanner scanner = new Scanner(System.in);//创建一个功能菜单char key = ' ';boolean isShow = true;while (isShow){System.out.println("s:显示队列");System.out.println("a:添加数据");System.out.println("g:取出数据");System.out.println("h:显示头数据");System.out.println("e:退出程序");key = scanner.next().charAt(0);switch (key){case 's' :arrQueue.showQueue();break;case 'a' :System.out.println("请输入一个数:");int value = scanner.nextInt();arrQueue.addQueue(value);break;case 'g' :try {System.out.println(arrQueue.getQueue());} catch (Exception e) {e.printStackTrace();}break;case 'h' :try {arrQueue.headQueue();} catch (Exception e) {e.printStackTrace();}break;case 'e' :isShow = false;break;}}System.out.println("程序退出...");}
}

不可上位!数据结构队列,老实排队,Java实现数组模拟队列及可复用环形队列相关推荐

  1. 【算法】java 用 数组 模拟 队列

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 文章目录 1.概述 1.概述 本次使用java 用 数组 模拟 队列 package com.algor ...

  2. 数据结构和算法——基于Java——1.数组

    稀疏数组 理论补充 运用场景:当一个数组中大部分元素为0,或者为统一值的数组时.可以使用稀疏数组压缩数组释放占用的内存空间. 思想:第一行存储原数组:行,列,值.后续行存储原数组数据所在行,列,值. ...

  3. java中用数组模拟的酒店管理系统

    //房间类 public class Room {private String no;//房间号private String type;//房间类型private boolean isuse;//房间 ...

  4. 【数据结构】——环形队列

    文章目录 一.环形队列的定义及其特点 二.使用数组来实现环形队列 1.创建一个队列 2.初始化队列 3. 判断环形队列是否为空 4.判断环形队列是否已满 5. 向循环队列插入元素,插入成功返回真 6. ...

  5. 数据结构与算法一:稀疏数组 队列 链表

    1 线性结构和非线性结构 数据结构包括:线性结构和非线性结构. 1.1 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和 ...

  6. 数组模拟实现队列(Java语言描述)

    队列的实例:电影院购票.排队打饭.去麦当劳买吃的,银行排队叫号等等这些场合都需要排队,生活中的各种排队现象就展示了队列的实例 队列的介绍:队列是个有序列表 队列的实现方式: 数组 链表 注意:若使用数 ...

  7. 数据结构与基础算法-环形队列

    一.什么是环形队列. 其实在内存上并没有所谓的环形队列,环形队列只是基于数组线性空间来实现. 环形队列优点: 避免假溢出现象.(因为在数组里,头尾指针只增加不减少,被删元素的空间再也不能被重新利用.会 ...

  8. 数据结构--环形队列的介绍与实现

    数据结构--环形队列实现 一.环形队列实现原理 环形队列的几个判断条件 二.代码实现 1.环形队列类(CircleQueue) 2.环形队列类测试类 3.程序运行结果 4.完整代码 环形队列可以用数组 ...

  9. java环形队列_使用环形队列触发延时任务

    类似需求:"如果连续30s没有请求包(例如登录,消息,keepalive包),服务端就要将这个用户的状态置为离线". 轮询处理 将所有任务都添加到某集合中,定时轮询扫描,如果达到条 ...

最新文章

  1. 将Java程序打jar包并运行
  2. 传统方法怎么玩计算机审美
  3. 《C++ Primer中文版(第5版)》学习笔记与习题完整发布!
  4. android sd卡列目录文件_Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等...
  5. Windows安装Redis(转!)
  6. python3 之 天天生鲜 项目 缓存cache
  7. Animator忽视TimeScale
  8. 自顶向下彻底理解 Java 中的 volatile 关键字
  9. Wpf之Tree使用Dictionary作为数据源
  10. 【CF551D】GukiZ and Binary Operations
  11. mysql多库备份_Mysql 之多库备份
  12. java 对excel指定单元格的数据修改后并输出到指定文件夹
  13. LINQ Enumerable 续 II
  14. 【 Codeforces Round #552 (Div. 3) G】Minimum Possible LCM【埃氏筛】
  15. oracle jde优势介绍,JDE 的扫盲知识介绍。。。
  16. FileUtils入门使用
  17. A Game with Traps—— 二分
  18. png转icon java,PNG转ICO - steambap的个人空间 - OSCHINA - 中文开源技术交流社区
  19. gg修改器怎么修改服务器数值,gg修改器怎么修改数值 | 手游网游页游攻略大全...
  20. Hibernate中,mappedBy和注解@JoinColumn的对比

热门文章

  1. Java 7:Fork / Join框架示例
  2. 跨站点脚本(XSS)和预防
  3. Spring安全:防止暴力攻击
  4. 在MySQL上使用带密码的GlassFish JDBC安全性
  5. 产品经理十大悲催错误
  6. IntelliJ IDEA for Mac 如何将普通 Java 项目变为 Web 项目
  7. android 前台服务自定义布局不显示_Android前台服务通知未显示
  8. @cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?
  9. php登陆页面修改密码的功能,使用bootstrap创建登录注册页面并实现表单验证功能...
  10. 属性面板 脚本_3.1 创建和使用脚本