文章目录

  • 数组模拟队列
    • 思路
    • 代码实现
    • 问题分析并优化
  • 数组模拟环形队列
    • 思路
    • 代码实现

数组模拟队列

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
  • 示意图: (使用数组模拟队列示意图)

思路

  • maxSize为队列最大容量
  • front和rear记录队列前后端的下标
  • front随着队列输出而改变,rear随着队列输入而改变
  • 当front = rear时,队列为空
  • 当rear = maxSize -1 时,队列满

代码实现

public class Demo02ArrayQueue {public static void main(String[] args) {//测试//创建一个队列ArrayQueue queue = new ArrayQueue(3);//设置队列最大值为3boolean flag = true;char key = ' ';//用于接收输入字符Scanner scanner = new Scanner(System.in);while (flag){System.out.println("请输入相应的命令操作队列");System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列中取出数据");System.out.println("h(head):查看队列头的数据");key= scanner.next().charAt(0);switch (key){case 's':queue.showQueue();break;case 'e':flag=false;break;case 'a':System.out.println("输入一个数:");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res =  queue.getQueue();System.out.println("被取出的数据是"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try {queue.showHead();}catch (Exception e){System.out.println(e.getMessage());}break;}}}
}
//使用数组模拟队列,编写一个ArrayQueue类
class ArrayQueue{private int maxSize;//队列最大值private int font;//队列头,指向队列头数据的前一个位置private int rear;//队列尾,指向队列尾数据本身下标private int[] arr;//存放队列的数组public ArrayQueue() {}public ArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];font=-1;rear=-1;}//判断队列是否满public boolean isFull(){return rear == maxSize-1;}//判断队列是否为空public boolean isEmpty(){return rear == font;}//添加数据到队列,n为添加的数据public void addQueue( int n){if (isFull()){System.out.println("队列已满,无法添加数据到队列");}else {rear++;arr[rear] = n;}}//从队列中取出数据public int getQueue(){if (isEmpty()){//抛出异常throw  new RuntimeException("队列空,不能取出数据");}else {font++;//返回被取出的数据return arr[font];}}//显示队列public void showQueue(){if (isEmpty()){System.out.println("队列为空!");}else {//font为队头的前一个下标,所以font+1就是头数据的下标for (int i = font+1; i <rear+1 ; i++) {System.out.println(arr[i]);}}}public void showHead(){if (isEmpty()){throw  new RuntimeException("队列空,不能取出数据");}else {System.out.println("队列头数据为"+arr[font+1]);}}
}

问题分析并优化

  1. 数组使用一次就不能用了,没有达到复用的效果
  2. 将这个数组使用算法,改进成一个环形队列,取模:%

数组模拟环形队列

思路

对前面的数组模拟队列的优化,充分利用数组.因此将数组看做是一个环形的。(通过取模的方式来实现即可)


注意点:

  • front表示队列头本身下标,rear表示队列尾下一个数据的下标,初始值都为0
  • (rear+1)%maxSize == front判断队列是否已满
  • 添加元素 rear=(rear+1)%maxSize,防止下标越界 任何数取余不会超过除数。获取元素也一样。
  • size()返回队列中有效数据的个数 (rear+maxSize - front)%maxSize,+maxSize使rear-front不会为负数
  • 遍历时 i%maixsize 不会越界

代码实现


public class Demo03CircleArrayQueue {public static void main(String[] args) {//测试//创建一个队列CircleArrayQueue queue = new CircleArrayQueue(4);//设置队列最大值为3boolean flag = true;char key = ' ';//用于接收输入字符Scanner scanner = new Scanner(System.in);while (flag){System.out.println("请输入相应的命令操作队列");System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列中取出数据");System.out.println("h(head):查看队列头的数据");key= scanner.next().charAt(0);switch (key){case 's':queue.showQueue();break;case 'e':flag=false;break;case 'a':System.out.println("输入一个数:");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res =  queue.getQueue();System.out.println("被取出的数据是"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try {queue.showHead();}catch (Exception e){System.out.println(e.getMessage());}break;}}}
}//使用数组模拟队列,编写一个ArrayQueue类
class CircleArrayQueue{private int maxSize;//队列最大值private int font;//队列头,默认为0,指向队列头数据的下标private int rear;//队列尾,默认为0,指向队列尾数据的后一个数据的下标private int[] arr;//存放队列的数组public CircleArrayQueue() {}public CircleArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];}//判断队列是否满public boolean isFull(){return (rear+1)%maxSize==font;}//判断队列是否为空public boolean isEmpty(){return rear == font;}//添加数据到队列,n为添加的数据public void addQueue( int n){if (isFull()){System.out.println("队列已满,无法添加数据到队列");}else {arr[rear] = n;//防止rear越界,任何数取余不会超过除数。//将rear后移rear = (rear+1)%maxSize;}}//从队列中取出数据public int getQueue(){if (isEmpty()){//抛出异常throw  new RuntimeException("队列空,不能取出数据");}else {int value = arr[font];//防止font越界,任何数取余不会超过除数。//将font后移font = (font+1)%maxSize;//返回被取出的数据return value;}}//显示队列public void showQueue(){if (isEmpty()){System.out.println("队列为空!");}else {//font为队头的前一个下标,所以font+1就是头数据的下标for (int i = font; i <size() ; i++) {//防止i%maxSize下标越界System.out.println(arr[i%maxSize]);}}}public int size(){return (rear+maxSize-font)%maxSize;}public void showHead(){if (isEmpty()){throw  new RuntimeException("队列空,不能取出数据");}else {System.out.println("队列头数据为"+arr[font]);}}
}

(数据结构与算法)数组模拟队列和环形队列相关推荐

  1. 【Java数据结构与算法】Java如何实现环形队列

    用Java如何实现环形队列 1. 数组模拟队列的问题 数组使用一次就不能用,没有达到复用的效果. 2. 思路一 初始位置: front 和 rear 都在 -1. front 指向队列第一个元素的前一 ...

  2. java 二维链表_Java数据结构与算法----数组与链表

    数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...

  3. php环行队列实现,java数组实现队列及环形队列实现过程解析

    这篇文章主要介绍了java数组实现队列及环形队列实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码内容 ArrayQueue---用数 ...

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

    目录 1.队列的概念及结构 2.队列的实现 3.队列的相关实现函数与源代码 3.1初始化队列 3.2 队尾入队列 3.3 队头出队列 3.4获取队列头部元素 3.5 获取队列队尾元素 3.6 获取队列 ...

  5. JavaScript数据结构与算法——数组详解(下)

    1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...

  6. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc

    数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...

  7. 队列——普通队列和环形队列

    队列 定义:由一个长度固定的数组和两个指针所组成的数据结构,先进先出. 功能:add delete list 实现逻辑:由组成队列的数组自身是不变化的,指针是一个表示数组下标,而且不断变化的一个数.由 ...

  8. 队列与环形队列使用数组模拟

    队列 该文是观看尚硅谷韩老师视频学习自己总结学习得,有的是来源于网络收集 队列引入 进的一端称为队尾(rear),出的一端称为队头(front).队列可以用顺序存储,也可以用链式存储. 队列介绍 队列 ...

  9. 数据结构与算法学习笔记之先进先出的队列

    前言 队列是一种非常实用的数据结构,类似于生活中发排队,可应用于生活,开发中各个方面,比如共享打印机(先请求先打印),消息队列.你想知道他们是怎么工作的么.那就来一起学习一下队列吧 正文 一.队列的定 ...

最新文章

  1. Python web 项目的依赖管理工具
  2. nginx的502问题
  3. 牛客网(剑指offer) 第七题 斐波那契数列
  4. 中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!
  5. Centos安装NFS服务器配置及挂载教程
  6. python万年历_python万年历
  7. ap 目标检测算法map_目标检测mAP怎么计算
  8. 利用可道云kodexplorer一键部署私有云!路由器免费变NAS!
  9. Win7批量离线更新补丁方法
  10. 淘宝/天猫买家信息 API
  11. 基于jQuery的图片懒加载插件
  12. 【软路由安装(PVE+ikuai)】
  13. js获取PC设备信息,js获取手机设备信息,最全
  14. 联想m920t装红旗linux中SPik,联想ThinkCentre M920t台式机装win10系统及bios设置(uefi+gpt)...
  15. AUTOSAR MCAL CAN Driver 接口函数
  16. java word 题目导入_Java导入导出Excel和Word
  17. Linux 启动定时任务配置
  18. 我如何在咨询项目中使用Vagrant和Docker
  19. 如何使用 JavaScript 创建水平和垂直标签?
  20. Vue过滤器的几种用法

热门文章

  1. 趣链 BitXHub跨链平台 (3)跨链交易流程
  2. (chap9 基于HTTP的功能追加协议) 期盼已久的http 2.0
  3. OSI网络体系结构各层协议:
  4. [ATF]-TEE/REE系统切换时ATF的寄存器的保存和恢复
  5. Golang经典面试题上
  6. Win32 Edit 文本框追加字符串
  7. 使用 python 一键搭建文件服务器
  8. 编写第一个Android程序
  9. 软件调试学习笔记(六)—— 硬件断点
  10. 1.11 Java数组填充(fill())