初步深入的学习数据结构和算法

数据结构是真的耗费时间呐,把想法用数学的方式总结,然后写成代码。

package com.zwj.queue;import java.util.Scanner;/*** @author zwj* @create 2021-08-19-13:32*/
public class CircleArrayQueueDemo {public static void main(String[] args) {//测试一把System.out.println("测试数组模拟环形队列的案例~~~");// 创建一个环形队列CircleArray queue = new CircleArray(4); //说明设置4, 其队列的有效数据最大是3char key = ' '; // 接收用户输入Scanner scanner = new Scanner(System.in);//boolean loop = true;// 输出一个菜单while (loop) {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 'a':System.out.println("输出一个数");int value = scanner.nextInt();queue.addQueue(value);break;case 'g': // 取出数据try {int res = queue.getQueue();System.out.printf("取出的数据是%d\n", res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}break;case 'h': // 查看队列头的数据try {int res = queue.headQueue();System.out.printf("队列头的数据是%d\n", res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}break;case 'e': // 退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~");}
}class CircleArray {private int maxSize; // 表示数组的最大容量,队列最大长度+1//front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素//front 的初始值 = 0private int front;//rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.//rear 的初始值 = 0private int rear; // 队列尾private int[] arr; // 该数据用于存放数据, 模拟队列public CircleArray(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];}// 判断队列是否满,因为设置的预留的空间是可以移动的,就是当rear处在预留的空间的时候,也代表数组就是满的,// 数组满就代表着rear和float就是相邻的,而且必须是r的上面一个位置就是fpublic boolean isFull() {return (rear  + 1) % maxSize == front;}// 判断队列是否为空public boolean isEmpty() {return rear == front;}// 添加数据到队列public void addQueue(int n) {// 判断队列是否满if (isFull()) {System.out.println("队列满,不能加入数据~");return;}//直接将数据加入  因为rear初始值为0 而循环列表初始值为-1arr[rear] = n;//将 rear 后移, 这里必须考虑取模rear = (rear + 1) % maxSize;}// 获取队列的数据, 出队列public int getQueue() {System.out.println("front:" +front);// 判断队列是否空if (isEmpty()) {// 通过抛出异常throw new RuntimeException("队列空,不能取数据");}// 这里需要分析出 front是指向队列的第一个元素// 1. 先把 front 对应的值保留到一个临时变量// 2. 将 front 后移, 考虑取模// 3. 将临时保存的变量返回int value = arr[front];front = (front + 1) % maxSize;return value;}// 显示队列的所有数据public void showQueue() {// 遍历System.out.println("rear:" +rear);if (isEmpty()) {System.out.println("队列空的,没有数据~~");return;}// 思路:从front开始遍历,遍历多少个元素// 动脑筋for (int i = front; i < front + size() ; i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}// 求出当前队列有效数据的个数,分两种情况去想,// 第一种是rear在front的上面,这个很简单。直接rear - front + 1 就好了(取模前是1,取模了就是maxSize)// 第二种是在下面,这个也简单,就是就是用maxSize - r和f的相差的距离 maxSize - (front - rear)//但是这样要写判断,所以总结一下要么r-f要么f-r,只不过是正负的问题,所以干脆都给两个式子取模那么也就是下面的答案了public int size() {// rear = 2// front = 1// maxSize = 3return (rear + maxSize - front) % maxSize;}// 显示队列的头数据, 注意不是取出数据public int headQueue() {// 判断if (isEmpty()) {throw new RuntimeException("队列空的,没有数据~~");}return arr[front];}
}

学习方法

我主要就是犯病,就得把一个个表达式为什么这么算搞通了才舒服,简而言之就是目标加思路加实践。另外多嘴一句学数据结构还是要多动笔啊!

环形队列数组展示(韩顺平)相关推荐

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

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

  2. 数据结构和算法Java实现(韩顺平)

    目录 稀疏数组 队列 数组模拟队列思路 数组模拟环形队列 链表 单链表的翻转 单链表的逆序输出(栈) 双向链表 Jasephu 问题 栈 数组模拟 栈实现计算器 中缀表达式 计算器 逆波兰表达式 (后 ...

  3. 数据结构-队列-数组队列

    自定义队列 文章目录 自定义队列 数组队列 简述: 数组环形队列 数组队列 简述: 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大 ...

  4. 尚硅谷java数据结构与算法 韩顺平 数组实现队列问题

    day2学习打卡:数组实现循环队列 package queue;import java.util.Scanner; //这里没有使用循环队列的思想所以造成了数组空间的浪费(数组空间不能复用) publ ...

  5. 队列——数组实现环形队列

    [目的] 数组实现环形队列 [思路分析] 1.  front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素 front 的初始值 ...

  6. (数据结构与算法)数组模拟队列和环形队列

    文章目录 数组模拟队列 思路 代码实现 问题分析并优化 数组模拟环形队列 思路 代码实现 数组模拟队列 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取 ...

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

    文章目录 队列简介 数组模拟队列(无法复用) 数组模拟环形队列(可复用) 队列简介 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即先存入队列的数据,先取出,后存入的后取出. 示 ...

  8. 柔性数组和环形队列之间的故事

    之前的文章,讲解了柔性数组,有很多人留言,提到一些问题.刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列. 柔性数组的上一篇文章 环形队列C语言实现文章 ...

  9. 单片机实现环形队列_稀疏数组和队列(二)

    队列的介绍 队列以一种先入先出(FIFO)的线性表,还有一种先入后出的线性表(FILO)叫做栈. 教科书上有明确的定义与描述.类似于现实中排队时的队列(队尾进,队头出),队列只在线性表两端进行操作,插 ...

最新文章

  1. Why am I getting this error “Expected resource of type raw” in Android Studio?
  2. 1.12 深层循环神经网络-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. Wiki1017(乘积最大)
  4. Android之系统服务-WindowManager
  5. android 传感器 balance filter,Android 传感器 API.doc
  6. 翻译:程序员数据结构基础:选择正确的数据结构
  7. 四则运算2任务完成表
  8. html提交表单使用python计算_教你使用Python实现新个税计算器
  9. 防止文件重复定义之方法
  10. 第一章 QT Creator 简介
  11. win7旗舰版+caffe+vs2013+matlab2014b(无GPU版)
  12. 单例模式之双重检查锁(double check locking)的发展历程
  13. 一点总结,手机应用开发前景
  14. sprk sql自定义UDF函数
  15. python项目方案书-前端python解释器方案预研
  16. micropython固件编译_Micropython编译固件的操作步骤
  17. 各种格式PPC手机软件的安装方法
  18. JVisualVM监控
  19. CSS:个人常用按钮样式
  20. iOS一代码搞定定位

热门文章

  1. 大数据再出发-19Flink
  2. 中介者模式 - 门面
  3. 【经验】经验总结-经验教训
  4. java计算机毕业设计红色景点自驾游网站管理系统MyBatis+系统+LW文档+源码+调试部署
  5. 【优化选址】基于人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码
  6. 用jQuery仿京东收货地址
  7. kubeadm快速部署一套K8S集群
  8. python多态和鸭子类型
  9. 5G基带芯片之战现状:一二三分别对应联发科华为高通
  10. cas1082287-99-7齐岳生物花菁染料合成线路