队列

有序列表,可以用数组或者链表来实现

特点:先进先出

eg:银行排号

数组模拟队列算法


代码实现

public class ArrayQueueDemo {public static void main(String[] args) {//创建ArrayQueue arrayQueue = new ArrayQueue(3);char key =' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop){System.out.println("s:显示");System.out.println("e:退出");System.out.println("a:添加");System.out.println("f:展示");System.out.println("g:取数据");System.out.println("h:队头");key = scanner.next().charAt(0);switch (key){case 's': {arrayQueue.findAllQueue();break;}case 'a':{System.out.println("请输入一个数");int value = scanner.nextInt();arrayQueue.addQueue(value);break;}case 'g':{try {int result = arrayQueue.getQueue();System.out.println("取出的数据是:"+result);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'h':{try {int reslut = arrayQueue.findHeadQueue();System.out.println("队列的头部元素是:"+reslut);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'e':{scanner.close();System.out.println("退出程序");loop = false;break;}default:break;}}}
}
//
class ArrayQueue{private int maxSize;//数组最大容量private int front;//指向队列头部的标识private int rear;//指向队列尾部的标识private int arr[];//保存数据,模拟队列//常见队列的构造器public ArrayQueue(int arrMaxSize){maxSize = arrMaxSize;arr = new int[maxSize];front = -1;//队列头部前一个位置rear = -1;//指向队列尾部,即包含队列最后一个数据的位置下标}//判断是否为满public boolean isFull(){return rear == maxSize - 1 ;}//判断队列是否为空public boolean isEmpty(){return rear == front;}//添加数据到队列public void addQueue(int n){if (isFull()){System.out.println("队列已满,不能加入数据");return;}rear++;arr[rear] = n;}//出队列public int getQueue(){if (isEmpty()){throw new RuntimeException("队列为空,不能取出数据");}return arr[++front];}//显示队列所有数据public void findAllQueue(){//遍历数据if (isEmpty()){System.out.println("队列为空,没有数据");return;}for (int i =0 ;i<arr.length;i++){System.out.print(arr[i]+"\t");}}//显示队列头数据public int findHeadQueue(){//判断是否为空if (isEmpty()){throw new RuntimeException("队列为空,没有数据");}return arr[front+1];}
}

缺点:

我们取出队列,队列是少了一个元素,但是显示还是原来的,刚取出的元素还被显示了(事实上已经取出来了)

我们的队列没有办法实行环形,我们取出结束,不能再加元素了,也就是我们的头指针没有指向最初,不能复用

改进环形队列

取%

front指向我们的第一个元素下标,即arr【front】就是第一个元素

front初始值为0

rear指向队列的最后一个元素的后面的一个位置,空出一个空间做约定

rear初始值为0

队列满时的条件

(rear+1)%maxSize = front

队列为空,

rear = front

队列的有效的数据个数为

(rear + maxSize - front)%maxSize
public class CircleArrayQueueDemo {public static void main(String[] args) {CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);char key =' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop){System.out.println("s:显示");System.out.println("e:退出");System.out.println("a:添加");System.out.println("f:展示");System.out.println("g:取数据");System.out.println("h:队头");key = scanner.next().charAt(0);switch (key){case 's': {circleArrayQueue.findAllCircleQueue();break;}case 'a':{System.out.println("请输入一个数");int value = scanner.nextInt();circleArrayQueue.addCircleQueue(value);break;}case 'g':{try {int result = circleArrayQueue.getCircleQueue();System.out.println("取出的数据是:"+result);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'h':{try {int reslut = circleArrayQueue.findCircleHeadQueue();System.out.println("队列的头部元素是:"+reslut);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 'f':{System.out.println(circleArrayQueue.size());break;}case 'e':{scanner.close();System.out.println("退出程序");loop = false;break;}default:break;}}}
}
class CircleArrayQueue{private int maxSize;//数组最大容量private int front;//指向队列头部的标识 初始值为0private int rear;//指向队列尾部的标识private int arr[];//保存数据,模拟队列//创建队列的构造器public CircleArrayQueue(int arrMaxSize){maxSize = arrMaxSize;arr = new int[maxSize];front = 0;rear = 0 ;}//判断是否满public boolean isFull(){return (rear + 1)%maxSize == front;}//判断队列是否为空public boolean isEmpty(){return rear == front;}//添加数据到队列public void addCircleQueue(int n){if (isFull()){System.out.println("队列已满,不能加入数据");return;}//直接将数据加入arr[rear] = n;//rear后移rear = (rear + 1)%maxSize;}//出队列public int getCircleQueue(){if (isEmpty()){throw new RuntimeException("队列为空,不能取出数据");}//front直接指向我们队列第一个元素了//1.先把front的值保存一下,//2.front++//3.将保存的变量返回int value = arr[front];front = (front+1)%maxSize;return value;}//求出当前数据有效个数public int size(){return (rear + maxSize - front)%maxSize;}//显示队列所有数据public void findAllCircleQueue(){//遍历数据if (isEmpty()){System.out.println("队列为空,没有数据");return;}//从front开始遍历,不应该是从0开始//for (int i =front ;i<front+size();i++){System.out.print(arr[i%maxSize]+"\t");}System.out.println("输出完毕");}//显示队首public int findCircleHeadQueue(){//判断是否为空if (isEmpty()){throw new RuntimeException("队列为空,没有数据");}return arr[front];}
}

数据结构-----队列笔记相关推荐

  1. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

  2. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  3. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

  4. 数据结构学习笔记(六):二叉树(Binary Tree)

    目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...

  5. 数据结构学习笔记(五):重识字符串(String)

    目录 1 字符串与数组的关系 1.1 字符串与数组的联系 1.2 字符串与数组的区别 2 实现字符串的链式存储(Java) 3 子串查找的简单实现 1 字符串与数组的关系 1.1 字符串与数组的联系 ...

  6. 数据结构学习笔记(四):重识数组(Array)

    目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...

  7. Python数据结构学习笔记——链表:无序链表和有序链表

    目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...

  8. 数据结构个人笔记 第12课 数组

    数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...

  9. 数据结构自学笔记二、栈

    数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...

  10. 考研[*数据结构*]学习笔记汇总(全)

    文章目录: 一:预备阶段 二:基础阶段笔记 三:冲刺阶段笔记 四:各章节思维导图 五:题库 来源:王道计算机考研 数据结构 一:预备阶段 之前的数据结构笔记 数据结构--学习笔记--入门必看[建议收藏 ...

最新文章

  1. mac apache 配置
  2. kill session-KILL_SESSION()
  3. centos 上传jar 命令_centos上快速将一个jar使用docker部署启动
  4. pdm生成mysql sql语句_如何用Powerdesigner的PDM生成数据库
  5. 信息发布服务器hp3000,HPCS-3000型DCS系统维护说明….doc
  6. 进入顶层社会的顺序是什么?
  7. 如何啃透周志华的《机器学习》西瓜书?
  8. React脚手架配置代理解决跨域
  9. mysql float数据类型和decimal数据类型
  10. 原 sublime text 批量删除空白行
  11. 开发在线投票系统过程遇到的问题
  12. Android P 隐藏状态栏电池图标
  13. 线性代数笔记【空间向量】
  14. 网页播放全景视频和全景图片
  15. 机器人图形变变变_中班数学活动——图形变变变 教案
  16. matlab 根据长轴,短轴,中心坐标画椭圆
  17. 并网光伏逆变器的基本设计
  18. 解决jupyter notebook无法跳转浏览器
  19. 软件测试49个必问面试题合集+答案
  20. java怎么创建二进制文件_如何为Java应用程序创建本机二进制文件?

热门文章

  1. request重定向_Python转发与重定向
  2. vagrant:修改Linux网络设置
  3. Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
  4. 机器学习笔记——感知机理解(自行取用,并不一定适合每个人)
  5. 小目标Trick | Detectron2、MMDetection、YOLOv5都通用的小目标检测解决方案
  6. Deep Convolutional Network Cascade for Facial Point Detection论文算法解析
  7. 4、vueJs基础知识04
  8. salt 服务启动失败
  9. 聊聊我怎么系统学习Linux技能并快速提高的
  10. Spring Cloud之Zuul网关集群