数据结构-队列-数组队列
自定义队列
文章目录
- 自定义队列
- 数组队列
- 简述:
- 数组环形队列
数组队列
简述:
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。
因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:
- 自定义简单数组对列(有问题,不能重复使用)
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. 说明 2. 实现代码 1. 数组队列类 2.数组队列测试类 3.代码运行结果 3.完整代码 1. 说明 队列是一个有序列表,可以用数组或者链表来实现. 遵循先入先出(F ...
- 数据结构实践——队列数组
本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目. [项目 - 队列数组] 创建10个队列,分别编号为0-9(处理为队列数组,编号即下标).输入若干个正整数,以数字0作为结束.设输入的值为 ...
- 数据结构之数组、链表、栈和队列
1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...
- 03:数据结构 栈、队列、链表与数组
算法其他篇 目录: 1.1 数据结构中的一些概念 1.2 栈(stack) 1.3 队列 1.4 链表 1.5 python中字典对象实现原理 1.6 数组 1.1 数据结构中的一些概念 返回 ...
- 基于java的数据结构学习——数组实现的队列和循环队列及性能对比
队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...
- java 数据结构_Java版-数据结构-队列(数组队列)
前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...
- 循环队列的java结构_java数据结构之循环队列(数组实现)
package com.ws.队列.数组环形队列; //环形数组队列 //判断满:尾+1%队列长度==头 //添加数据:要(尾+1)%数组长度 //取出数据:要(头+1)%数组长度 因为这两个都是循环 ...
- 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...
作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...
- Java版数据结构之数组模拟环形队列demo
Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...
最新文章
- 缓存算法(页面置换算法)-FIFO、LFU、LRU
- php内核总结_深入PHP内核之面向对象总结
- Android ListView下拉与上拉刷新加载更多(一)
- Extjs ComboBox常用的配置
- 决策树留一法python代码_西瓜书 第4章 决策树 读书笔记
- qtableiwdget优化之再优化(大批量数据加载不卡顿)
- 大学计算机基础题库百度云资源,《大学计算机基础试题题库及答案》.pdf
- [软件推荐]一款win7 x86 x64都能用的免费内存虚拟盘的小工具——ImDisk
- windows7副本不是正版解决方法
- OpenCV边缘检测算法
- 财报识别OCR,披露虚假财务报表
- 微信邮箱怎么弄怎么写?手机可以移动办公吗?
- office 文档在线预览新姿势之永中云转换
- Word插入的表格怎么合并单元格
- 估值最高的自媒体达38亿,不是咪蒙、一条,也不是逻辑思维,而是他..
- nfphosting注册教程,超低价VPS商家,年付4美元,支持支付宝
- 当心!共享单车二维码暗藏信息安全隐患
- 连夜下架杨笠代言的Intel,扯下了科技圈“男孩俱乐部”的遮羞布
- 不想露脸的6个拍照技巧,给人无限想象,速速收藏
- 蓝桥杯单片机 赛后资料整理——NE555芯片模块与第十届省赛的总结