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

队列的介绍

队列以一种先入先出(FIFO)的线性表,还有一种先入后出的线性表(FILO)叫做栈。

教科书上有明确的定义与描述。类似于现实中排队时的队列(队尾进,队头出),队列只在线性表两端进行操作,插入元素的一端称为表尾,删除(取出)元素的一端称为表头。分别对应于 入队和出队操作。

存储结构:

· 线性存储结构,称为顺序队列,使用数组实现

· 链式存储结构,称为链队,使用链表实现。

图解入队操作

3f804a1ab04a7105dae4252c18592c3c.png
92a5b4dc646f20a8fe6d5e989e61fe2c.png
b9291ff80fe4639dcf810363775d3860.png
2c9fc1face1f54d0ffbfb72fe21ff0d9.png
995ab6192d84323611fa0509b10a6995.png
5c75a0eeb1de696b92ba660a1ac494a7.png

图解出队操作

fb153c56dcbad6e1472bd98342855378.png
a4e29d3162aaa2e71fb5607b609cbb3a.png
f0521873497ffa7fa611167ea1f222bf.png
133c50ab621171fe6460fc08181b23f3.png

队列的使用场景

数组模拟顺序队列

代码实现:

/**  * All rights Reserved, Designed By https://www.tulingxueyuan.com/ * @Title: ArrayQueue.java  * @Package com.tuling.queue2  * @Description:  * @author: 小白  * @Date 2019年11月11日 下午5:54:51  * @version V1.0  * @Copyright:  */ package com.tuling.queue2;/** * @ClassName ArrayQueue * @Description  * @Author 北京图灵学院 * @Date 2019年11月11日 下午5:54:51 */public class ArrayQueue {//定义一个数组,用来模拟队列,存储数据private Integer[] arr;//定义一个变量,用来指向队列头private int front;//定义一个变量,用来指向队列尾private int rear;/** *  * @Title: ArrayQueue  * @Description: 构造方法  * @param queueSize:队列初始化容量。  * @throws  */public ArrayQueue(int queueSize) {if(queueSize < 0) {throw new IllegalArgumentException("初始化容量不能小于0");}arr = new Integer[queueSize];front = 0;rear = 0;}/** *  * @Title: addQueue  * @Description: 入队操作: * 1、首先判断队列容量情况 * 2、如果队列未满,队列头不变,向队列尾下标位置插入数据,同时,队列尾+1 * @param: @param num  * @return: void  * @throws */public void addQueue(int num) {if(isFull()) {throw new IllegalArgumentException("队列已满!");}arr[rear] = num;rear++;}/** *  * @Title: isFull  * @Description: 判断队列是否已满 * @return: boolean  * @throws */public boolean isFull() {return rear == arr.length;}/** *  * @Title: getQueue  * @Description: 出队操作 * 1、先判读当前队列是否为空 * 2、每次从队列头开始出队,出队一个元素,队列头+1  * @param:  * @return: int  * @throws */public int getQueue() {if(isEmpty()) {throw new IllegalArgumentException("队列为空!");}return arr[front++];}/** *  * @Title: isEmpty  * @Description: 判断当前队列是否为空  * @return: boolean  * @throws */public boolean isEmpty() {return front == rear;}/** *  * @Title: showQueue  * @Description:显示队列的所有数据  * @param:  * @return: void  * @throws */public void showQueue() {if(isEmpty()) {throw new IllegalArgumentException("队列为空!");}for (int i = front; i < rear; i++) {System.out.println(i + " --> " + arr[i]);}}}/**  * All rights Reserved, Designed By https://www.tulingxueyuan.com/ * @Title: ArrayQueueDemo.java  * @Package com.tuling.queue2  * @Description:  * @author: 小白  * @Date 2019年11月11日 下午6:22:00  * @version V1.0  * @Copyright:  */ package com.tuling.queue2;/** * @ClassName ArrayQueueDemo * @Description  * @Author 北京图灵学院 * @Date 2019年11月11日 下午6:22:00 */public class ArrayQueueDemo {/**  * @Title: main  * @Description:  * @param: @param args  * @return: void  * @throws  */public static void main(String[] args) {ArrayQueue aq = new ArrayQueue(5);aq.addQueue(5);aq.addQueue(8);aq.addQueue(7);aq.showQueue();System.out.println("------------------------------------");aq.addQueue(2);aq.addQueue(9);//aq.addQueue(9);aq.showQueue();System.out.println("------------------------------------");System.out.println("出队");aq.getQueue();aq.showQueue();System.out.println("------------------------------------");System.out.println("出队");aq.getQueue();aq.showQueue();System.out.println("------------------------------------");System.out.println("出队");aq.getQueue();aq.showQueue();System.out.println("------------------------------------");System.out.println("出队");aq.getQueue();aq.showQueue();System.out.println("------------------------------------");System.out.println("出队");aq.getQueue();aq.showQueue();}}

顺序队列的溢出现象

· "下溢"现象:当队列为空时,做出队运算产生的溢出现象。"下溢"是正常现象,常用作程序控制转移的条件。

· "真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。"真上溢"是一种出错状态,应设法避免。

· "假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远 远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

数组模拟环形队列

为了解决顺序队列中"假上溢"的现象,同时更好的利用内存空间,我们将其实现为环形队列。

理解环形队列

首先我们要说明的是循环队列仍然是基于数组实现的。但是为了形象化的说明问题,我们如下图所示

66c8c5baa7742b1edc479a188ae9a323.png

1. 图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front、rear,一个指示队头,一个指示队尾。

2. rear和front互相追赶着,这个追赶过程就是队列添加和删除的过程,如果rear追到head说明队列满了,如果front追到rear说明队列为空。

3. 我们把它掰弯,用的是求余,这样两个值就不会跑出最大范围,并且可以实现弯曲的效果,所以说对于循环队列我们必须给定最大值。这其实是我们臆想的,我们要做的就是利用循环来解决空间浪费的问题。

环形队列的实现过程

· 当添加一个元素时,(rear+1)%MAXQSIZE; //理解为什么求余?

· 当删除一个元素时,(front+1)%MAXQSIZE;//理解为什么求余?

· 当rear=front的时候,队列可能是满,也可能是空。

· 因为存在满和空两种情况,我们需要分别判断:

· 满:当队列添加元素到rear的下一个元素是head的时候,也就是转圈子要碰头了,我们就认为队列满了。(rear+1)%MAXSIZE=Q.front

· 空:当队列删除元素到head=rear的时候,我们认为队列空了。rear==front,不一定为0

环形队列代码实现

CircularQueue.java 类代码如下:

/**  * All rights Reserved, Designed By https://www.tulingxueyuan.com/ * @Title: CircularQueue.java  * @Package com.tuling.circular  * @Description:  * @author: 北京图灵学院  * @date: 2019年11月13日 下午5:13:16  * @version V1.0  * @Copyright:  */package com.tuling.circular;/** * @ClassName CircularQueue * @Description  * @Author 北京图灵学院 */public class CircularQueue {//该数组模拟环形队列,存储数据private Integer[] arr;//该变量指向队头private int front;//该变量指向队尾private int rear;//该变量表示当前队列的最大容量private int maxSize;//该变量表示当前队列有效数据的个数private int elementCount;/** *  * @param queueSize:队列的初始容量 */public CircularQueue(int queueSize) {if(queueSize < 0) {throw new IllegalArgumentException("初始化容量不能小于0!");}arr = new Integer[queueSize];maxSize = queueSize;front = 0;rear = 0;elementCount=0;}/** *  * @Title: addQueue  * @Description:入队操作 * 思路: * 1、判断队列是否已满 * 2、向队尾插入数据  * 3、将有效数据的个数 + 1 * @param: num  * @return: void  * @throws */public void addQueue(int num) {if(isFull()) {throw new IllegalArgumentException("队列已满!");}//队列未满,可以继续入队操作//想队尾插入数据arr[rear] = num;//移动尾指针rear = (rear + 1) % maxSize;elementCount+=1;}/** *  * @Title: isFull  * @Description:判断当前队列是否已满 * 判满条件: * 1、空出一个元素位置,区别队列判空的条件 * 2、保证队尾指针的范围在数组下标范围内,解决方案:对Maxsize取余 * (rear + 1) % maxSize == front  * @param:  * @return: boolean  * @throws */public boolean isFull() {return (rear + 1) % maxSize == front;}/** *  * @Title: showQueue  * @Description:显示队列当中的所有数据  * @param:  * @return: void  * @throws */public void showQueue() {if(isEmpty()) {throw new IllegalArgumentException("队列为空!");}for(int i = front; i < (front+elementCount);i++) {System.out.println((i%maxSize) + " --> " + arr[i%maxSize]);}}/** *  * @Title: isEmpty  * @Description:判断当前队列是否为空  * @param:  * @return: boolean  * @throws */public boolean isEmpty() {return front == rear;}/** *  * @Title: getQueue  * @Description: 出队操作 * 思路:出队需要操作队头后移,还需要注意队头的值范围。  * 1、先用一个临时变量存储当前队头 * 2、将队头后移 * front = (front + 1) % maxSize * 3、将有效数据个数 -1 * 4、return * @param:  * @return: int  * @throws */public int getQueue() {if(isEmpty()) {throw new IllegalArgumentException("队列为空!");}int tempHead = arr[front];front = (front + 1) % maxSize;elementCount-=1;return tempHead;}/** *  * @Title: showHead  * @Description:显示当前队列头,不进行出队操作  * @param:  * @return: void  * @throws */public void showHead() {if(isEmpty()) {throw new IllegalArgumentException("队列为空!");}System.out.println("当前队列的队列头为:" + front + " --> " + arr[front]);}}

测试代码:

/**  * All rights Reserved, Designed By https://www.tulingxueyuan.com/ * @Title: CircularQueueDemo.java  * @Package com.tuling.circular  * @Description:  * @author: 北京图灵学院  * @date: 2019年11月13日 下午5:30:43  * @version V1.0  * @Copyright:  */package com.tuling.circular;/** * @ClassName CircularQueueDemo * @Description  * @Author 北京图灵学院 */public class CircularQueueDemo {/**  * @Title: main  * @Description:  * @param: @param args  * @return: void  * @throws  */public static void main(String[] args) {CircularQueue cq = new CircularQueue(5);System.out.println("--------------------------1.入队操作-----------------------------");cq.addQueue(5);cq.addQueue(8);cq.addQueue(7);cq.addQueue(2);//cq.addQueue(9);cq.showQueue();System.out.println("--------------------------2.入队操作-----------------------------");System.out.println("出队:" + cq.getQueue());cq.showHead();System.out.println("出队:" + cq.getQueue());cq.showHead();System.out.println("出队:" + cq.getQueue());cq.showHead();System.out.println("出队:" + cq.getQueue());System.out.println("--------------------------3.入队操作-----------------------------");cq.addQueue(5);cq.addQueue(8);cq.addQueue(7);cq.addQueue(2);cq.showQueue();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画-Linux中断子系统综述

1、中断引发的面试教训2、什么是中断&#xff1f;中断&#xff1a; &#xff08;英语&#xff1a;Interrupt&#xff09;指当出现需要时&#xff0c;CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中&#xff0c;系统出现了一个必须由CPU立即…

SQL强化(二) 在Oracle 中写代码

一 : 关于查询中的转换 -- 字符串转换 一 : decode 函数 转换 SELECT DECODE ( PROTYPE.PRO_TYPE_DATE, L, 长, m, 短, 默认值 )FROM PROTYPE -- 字符串转换 二 : case 转换 SELECT T1.PRO_TYPE_ID, T1.PRO_TYPE_NAME, CASE T1.PRO_TYPE_DATEWHEN S THEN 短WHEN L THEN 长EL…

vue 非es6 写法怎么按须加载_Vue源码必学指南:flow(语法检查)以及rollup(模板打包)...

点击上方蓝色字关注我们~一、前言虽然 Vue3 已经公开了代码,但是Vue3.0还处于开发阶段&#xff0c;直接上手使用Typescript是不合适的 , 对于前端的老手是不错的选择, 但是如果没有研究源码经验的开发者还是建议使用完善, 成熟的源码进行入手. 而 Vue 2.x 中使用的 flow 是一个…

漫画|创业到底有多难?

我有一群同事&#xff0c;我们一起经历了一个产品从无到有的过程&#xff0c;从开始的斗志满满到最后跟老板的不欢而散&#xff0c;其中的辛酸苦楚也许只能我们自己能体味&#xff0c;在这过程中&#xff0c;我们共同经历过的事情&#xff0c;有快乐的&#xff0c;悲伤的&#…

生成step文件_利用opencv给彦女王生成一副蒙太奇画像

大家好呀&#xff0c;前两天烈阳天道1上映了&#xff0c;不知道大家看没看呢&#xff0c;里面还有一小段彦穿越虫洞与猴哥相遇的画面&#xff0c;彦女王啊啊啊~~所以我去网上爬了二百来张我大学的风景画&#xff0c;然后找了以前存的彦女王的图片&#xff0c;生成了一幅蒙太奇画…

浪漫情人节|C语言画心型

1.前言新年第一天上班&#xff0c;先祝大家新年快乐&#xff0c;巧的是&#xff0c;今天刚好又是情人节&#xff0c;所以想了下用C实现画心形符号~过年的时候&#xff0c;跟我表哥去接新娘&#xff0c;实地看了下&#xff0c;如果一个汉字内心没有点浪漫的细胞&#xff0c;很难…

CS190.1x Scalable Machine Learning

这门课是CS100.1x的后续课&#xff0c;看课程名字就知道这门课主要讲机器学习。难度也会比上一门课大一点。如果你对这门课感兴趣&#xff0c;可以看看我这篇博客&#xff0c;如果对PySpark感兴趣&#xff0c;可以看我分析作业的博客。 Course Software Setup 这门课的环境配置…

./4.sh: No such file or directory

sh push到目标板后提示出错 #!/bin/bash echo "ladjfaosdjfoia"头bin/bash 我们要看&#xff0c;sh在哪里 130|rk3399_idpad:/data # which sh /system/bin/sh rk3399_idpad:/data # 所以上面的代码应该写成 #!/system/bin/sh echo "ladjfaosdjfoia"修…

Spring总结四:IOC和DI 注解方式

首先我们要了解注解和xml配置的区别&#xff1a; 作用一样&#xff0c;但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置&#xff0c;也就是说我们使用了注解的方式&#xff0c;就不用再xml里面进行配置了&#xff0c;相对来说注解方式更为简便。 IOC获取对象注…

和后台如何对接_业务系统如何对接第三方服务?

在产品工作中&#xff0c;我们时常要对接第三方服务。本文作者从过往的对接项目经历中&#xff0c;提炼的关于业务系统&#xff0c;如何对接第三方服务的方法论&#xff0c;希望能对你有所帮助。随着公司业务的发展&#xff0c;我们有时会遇到&#xff0c;需要在自身业务系统中…

adb 启动某个apk

有时候需要用apk来启动某个apk adb shell am start -n com.android.launcher3/com.android.launcher3.Launcher 具体查看~ /rk3399_7in1/packages/apps/Launcher3/AndroidManifest.xml

Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?

1、obj-$ $(CONFIG_TEST) 是一个整体&#xff0c;$(bbb)表示引用变量 bbb 比如定义 CONFIG_TESTy $(CONFIG_TEST) 就是 y obj-$(CONFIG_TEST) 就是 obj-y 又比如定义 CONFIG_TESTm $(CONFIG_TEST) 就是 m obj-$(CONFIG_TEST) 就是 obj-m obj-y foo.o 该例子告诉Kbuild在这目…

Kconfig中的“depends on”和“select”

在Kconfig文件中&#xff1a; config Adepends on Bselect C它的含义是&#xff1a;CONFIG_A配置与否&#xff0c;取决于CONFIG_B是否配置。一旦CONFIG_A配置了&#xff0c;CONFIG_C也自动配置了。 参考资料&#xff1a;“select” vs “depends” in kernel Kconfig。 所以去…

数组的合并和升序排列_leetcode 33 搜索旋转排序数组

给你一个升序排列的整数数组 nums &#xff0c;和一个整数 target 。假设按照升序排序的数组在预先未知的某个点上进行了旋转。&#xff08;例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] &#xff09;。请你在数组中搜索 target &#xff0c;如果数组中存在…

[LeetCode] [C++] 206 Reverse Linked List 反转单项链表

题目要求 Reverse a singly linked list.LeetCode 206在线测试 问题描述 给定一个单项链表&#xff0c;将其反转后返回链表头节点。 思路分析1 可以完整的遍历一遍链表&#xff0c;将链表的每个节点的值存在数组中&#xff0c;然后反向遍历数组重新生存一个新 链表。这样做需要…

qq面板(仿版,未完待续中。。。。)---2017-04-24

主要实现效果&#xff1a; 1、点击对话&#xff0c;显示对话&#xff1b;点击联系人&#xff0c;显示联系人 2、在联系人界面&#xff1a; 实现好友列表的展开与折叠&#xff1b;&#xff08;图12&#xff09; 实现鼠标移到好友列表上的背景颜色的变化&#xff1b;&#xff08;…

苹果企业证书_苹果签名经常掉签原因大汇总

苹果签名就是数字签名&#xff0c;是基于非对称加密算法来实现的&#xff0c;对称加密就是通过非对称加密算法实现的&#xff0c;对称加密是通过同一份秘钥加密解密数据&#xff0c;非对称加密有两份秘钥&#xff0c;分别是公钥和私钥&#xff0c;用公钥进行加密的数据只能使用…

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

1. 锁的由来&#xff1f;学习linux的时候&#xff0c;肯定会遇到各种和锁相关的知识&#xff0c;有时候自己学好了一点&#xff0c;感觉半桶水的自己已经可以华山论剑了&#xff0c;又突然冒出一个新的知识点&#xff0c;我看到新知识点的时候&#xff0c;有时间也是一脸的懵逼…

不废话~就是抽奖~

不废话就是抽奖 在公众号回复-抽奖- 获取抽奖二维码参与抽奖

威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!

点击上方电工小青年&#xff0c;关注并星标专业的电工电气领域自媒体&#xff0c;不容错过欢迎转发朋友圈~PLC常见的输入设备有按钮、行程开关、接近开关、转换开关、拨码器、各种传感器等&#xff0c;输出设备有继电器、接触器、电磁阀等。正确地连接输入和输出电路&#xff0…