数据结构-----队列笔记
队列
有序列表,可以用数组或者链表来实现
特点:先进先出
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];}
}
数据结构-----队列笔记相关推荐
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第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 第 ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- 数据结构学习笔记(六):二叉树(Binary Tree)
目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...
- 数据结构学习笔记(五):重识字符串(String)
目录 1 字符串与数组的关系 1.1 字符串与数组的联系 1.2 字符串与数组的区别 2 实现字符串的链式存储(Java) 3 子串查找的简单实现 1 字符串与数组的关系 1.1 字符串与数组的联系 ...
- 数据结构学习笔记(四):重识数组(Array)
目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...
- Python数据结构学习笔记——链表:无序链表和有序链表
目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...
- 数据结构个人笔记 第12课 数组
数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...
- 数据结构自学笔记二、栈
数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...
- 考研[*数据结构*]学习笔记汇总(全)
文章目录: 一:预备阶段 二:基础阶段笔记 三:冲刺阶段笔记 四:各章节思维导图 五:题库 来源:王道计算机考研 数据结构 一:预备阶段 之前的数据结构笔记 数据结构--学习笔记--入门必看[建议收藏 ...
最新文章
- mac apache 配置
- kill session-KILL_SESSION()
- centos 上传jar 命令_centos上快速将一个jar使用docker部署启动
- pdm生成mysql sql语句_如何用Powerdesigner的PDM生成数据库
- 信息发布服务器hp3000,HPCS-3000型DCS系统维护说明….doc
- 进入顶层社会的顺序是什么?
- 如何啃透周志华的《机器学习》西瓜书?
- React脚手架配置代理解决跨域
- mysql float数据类型和decimal数据类型
- 原	 sublime text 批量删除空白行
- 开发在线投票系统过程遇到的问题
- Android P 隐藏状态栏电池图标
- 线性代数笔记【空间向量】
- 网页播放全景视频和全景图片
- 机器人图形变变变_中班数学活动——图形变变变 教案
- matlab 根据长轴,短轴,中心坐标画椭圆
- 并网光伏逆变器的基本设计
- 解决jupyter notebook无法跳转浏览器
- 软件测试49个必问面试题合集+答案
- java怎么创建二进制文件_如何为Java应用程序创建本机二进制文件?
热门文章
- request重定向_Python转发与重定向
- vagrant:修改Linux网络设置
- Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
- 机器学习笔记——感知机理解(自行取用,并不一定适合每个人)
- 小目标Trick | Detectron2、MMDetection、YOLOv5都通用的小目标检测解决方案
- Deep Convolutional Network Cascade for Facial Point Detection论文算法解析
- 4、vueJs基础知识04
- salt 服务启动失败
- 聊聊我怎么系统学习Linux技能并快速提高的
- Spring Cloud之Zuul网关集群