自定义队列

文章目录

  • 自定义队列
    • 数组队列
      • 简述:
    • 数组环形队列

数组队列

简述:

队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。
因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:

  1. 自定义简单数组对列(有问题,不能重复使用)
package com.njau.queue;import java.util.Scanner;/*** @author 张文军* @Description:arrayQueue数组队列* @Company:南京农业大学工学院* @version:1.0* @date 2019/8/249:06*/
public class ArrayQueue {int maxiSize;int front;int rear;int[] arr;public ArrayQueue(int maxiSize) {this.maxiSize = maxiSize;arr = new int[maxiSize];front = -1;rear = -1;}public Boolean isFull() {return rear == maxiSize - 1;}public boolean isEmpty() {return rear == front;}public void addQueue(int n) {if (isFull()) {System.out.println("queue hase full !");return;} else {arr[++rear] = n;}}public int getQueue() {if (isEmpty()) {throw new RuntimeException("queue is empty !");} else {return arr[++front];}}public void showQueue() {if (!isEmpty()) {for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d] = %d\n", i, arr[i]);}} else {System.out.println("queue is empty !");}}public int getQueueHead() {if (isEmpty()) {throw new RuntimeException("queue is empty!");} else {return arr[front + 1];}}/***  测试*/public static void main(String[] args) {ArrayQueue queue = new ArrayQueue(3);Scanner scanner = new Scanner(System.in);Boolean loop = true;while (loop) {System.out.println("s 展示");System.out.println("a 添加");System.out.println("g 取数据");System.out.println("h 显示头数据");System.out.println("e 退出");char key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("请输入数据:");int i = scanner.nextInt();queue.addQueue(i);break;case 'g':try {int queue1 = queue.getQueue();System.out.println("取出的数据是:" + queue1);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int queueHead = queue.getQueueHead();System.out.println("头数据:" + queueHead);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'e':loop = false;break;default:break;}}System.out.println("exit !");}}

数组环形队列

上面简介和用数组简单实现了一下队列,但这种队列依然存在问题,问题就是用数组简单实现的队列会存在假溢出现象(即:在数据退出队列时,虽然数据未满,但是队列的 rear 已经是数组的大小,即显示已满。故不能继续插入数据 ),这样会极大的降低了数组的利用,所以,在这里我将会用数组实现一个环形队列,以解决这种问题。

  • 首先在这里,声明了一个容量大小为8的数组,并标出了索引0-7,然后使用front和 rear 分别来表示队列的,队首和队尾;在下图中,front 和 rear 的位置一开始都指向是了索引0的位置,这意味着当front == rear 的时候 队列为空 ,务必牢记这一点,以便区分后面介绍队列快满时的临界条件

  • front:表示队列队首,始终指向队列中的第一个元素(当队列空时,front指向索引为0的位置)

  • rear :表示队列队尾,始终指向队列中的最后一个元素的下一个位置

  • 元素入队,维护rear 的位置,进行rear ++操作

  • 元素出队,维护front的位置,进行front++操作

按照上面的front和rear的意思,对队列的维护即对是简单的++操作,即:入队就是将rear++,front不变,出队就是front++,rear不变。
即如下图所示:

然而,如果再向后面添加,即当出现

即当rear指向数组的最后,而且队列也已经有元素出队时,应为rear不能再向后移动,所以虽然数组有空的空间,但却不能插入数据,此时就出现了数组假溢出现象。然而,如果rear的位置用(rear+1)% maxSize ,则就会避免出现这种情况,即我们将现在的数组看成是一个环,当rear=front=0时,数组为空,插入一条数据,rear = (rear+1 )%maxSize = 1%8= 1; 当队列上图情况时,即rear已经是移动到数组的最后一个位置,而且有数据已经出队时,这时插入数据时,rear = (rear+1 )% maxSize = (7+1)%8 = 0,即循环到了下一个位置。同理,front的位置决定也是:front= (front+1)%maxSize,在这种情况下,必须要牺牲一个数组空间来(用于方便判断),而且判断队列是否已满的条件是rear==(front+1)%maxSize,为空rear==front ==0;

代码实现如下:

package com.njau.queue;/*** @author 张文军* @Description:数组循环队列* @Company:南京农业大学工学院* @version:1.0* @date 2019/9/23:42*/
public class ArrayCycleQueue {/*** 数组大小*/int maxiSize;/*** 指向队列的头元素*/int front;/*** 指向队列的最后一个元素的下一个元素*/int rear;/*** 数组*/int[] arr;public ArrayCycleQueue(int maxiSize) {this.maxiSize = maxiSize;arr = new int[maxiSize];front = 0;rear = 0;}public Boolean isFull() {return front == (rear + 1) % maxiSize;}public boolean isEmpty() {return rear == front;}public void addQueue(int n) {if (isFull()) {System.out.println("queue is full !");return;} else {arr[rear] = n;rear = (rear + 1) % maxiSize;}}public int getQueue() {if (isEmpty()) {throw new RuntimeException("queue is empty !");} else {int popData = arr[front];front = (front + 1) % maxiSize;return popData;}}public void showQueue() {if (!isEmpty()) {for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d] = %d\n", i, arr[i]);}} else {System.out.println("queue is empty !");}}public int getQueueHead() {if (isEmpty()) {throw new RuntimeException("queue is empty!");} else {return arr[front];}}}

测试:

    public static void main(String[] args) {ArrayCycleQueue queue = new ArrayCycleQueue(3);Scanner scanner = new Scanner(System.in);Boolean loop = true;while (loop) {System.out.println("s 展示");System.out.println("a 添加");System.out.println("g 取数据");System.out.println("h 显示头数据");System.out.println("e 退出");char key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("请输入数据:");int i = scanner.nextInt();queue.addQueue(i);break;case 'g':try {int queue1 = queue.getQueue();System.out.println("取出的数据是:" + queue1);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int queueHead = queue.getQueueHead();System.out.println("头数据:" + queueHead);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'e':loop = false;break;default:break;}}System.out.println("exit !");}

数据结构-队列-数组队列相关推荐

  1. 数据结构--数组队列的实现

    数据结构--数组模拟队列 1. 说明 2. 实现代码 1. 数组队列类 2.数组队列测试类 3.代码运行结果 3.完整代码 1. 说明 队列是一个有序列表,可以用数组或者链表来实现. 遵循先入先出(F ...

  2. 数据结构实践——队列数组

    本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目. [项目 - 队列数组] 创建10个队列,分别编号为0-9(处理为队列数组,编号即下标).输入若干个正整数,以数字0作为结束.设输入的值为 ...

  3. 数据结构之数组、链表、栈和队列

    1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...

  4. 03:数据结构 栈、队列、链表与数组

    算法其他篇 目录: 1.1 数据结构中的一些概念 1.2 栈(stack) 1.3 队列 1.4 链表 1.5 python中字典对象实现原理 1.6 数组 1.1 数据结构中的一些概念     返回 ...

  5. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比

    队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...

  6. java 数据结构_Java版-数据结构-队列(数组队列)

    前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...

  7. 循环队列的java结构_java数据结构之循环队列(数组实现)

    package com.ws.队列.数组环形队列; //环形数组队列 //判断满:尾+1%队列长度==头 //添加数据:要(尾+1)%数组长度 //取出数据:要(头+1)%数组长度 因为这两个都是循环 ...

  8. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  9. Java版数据结构之数组模拟环形队列demo

    Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...

最新文章

  1. 缓存算法(页面置换算法)-FIFO、LFU、LRU
  2. php内核总结_深入PHP内核之面向对象总结
  3. Android ListView下拉与上拉刷新加载更多(一)
  4. Extjs ComboBox常用的配置
  5. 决策树留一法python代码_西瓜书 第4章 决策树 读书笔记
  6. qtableiwdget优化之再优化(大批量数据加载不卡顿)
  7. 大学计算机基础题库百度云资源,《大学计算机基础试题题库及答案》.pdf
  8. [软件推荐]一款win7 x86 x64都能用的免费内存虚拟盘的小工具——ImDisk
  9. windows7副本不是正版解决方法
  10. OpenCV边缘检测算法
  11. 财报识别OCR,披露虚假财务报表
  12. 微信邮箱怎么弄怎么写?手机可以移动办公吗?
  13. office 文档在线预览新姿势之永中云转换
  14. Word插入的表格怎么合并单元格
  15. 估值最高的自媒体达38亿,不是咪蒙、一条,也不是逻辑思维,而是他..
  16. nfphosting注册教程,超低价VPS商家,年付4美元,支持支付宝
  17. 当心!共享单车二维码暗藏信息安全隐患
  18. 连夜下架杨笠代言的Intel,扯下了科技圈“男孩俱乐部”的遮羞布
  19. 不想露脸的6个拍照技巧,给人无限想象,速速收藏
  20. 蓝桥杯单片机 赛后资料整理——NE555芯片模块与第十届省赛的总结

热门文章

  1. 这些道理以前没人告诉我-困惑我们人生的问题的答案
  2. zabbix 触发器详解
  3. 8、16、32位单片机概念与寻址空间
  4. java输出windows系统日志_闲聊Windows系统日志
  5. 如何根据快递公司筛选出需要的单号
  6. WPF基础-XAML
  7. html marginleft属性,HTML DOM Style marginLeft 属性
  8. Ivan 的等待焦虑症发作了
  9. BIND9的架构与机制笔记1
  10. NOIP2016提高组口胡题解