队列是什么?

【数据结构】队列(顺序队列、循环队列、链队列) 文章目录 前言 一、队列的定义 二、队列的顺序存储结构 1.顺序队列的定义 2.循环队列定义 3.循环队列的基本操作 三、队列的链式存储结构 1.链队列的定义 2.链队列的基本操作 前言 队列也是一种线性表,其特殊性在于队列的基本操作是线性表的子集。队列按“先进先出”的规则进行操作,故称其为操作受限的线性表。 一、队列的定义 队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,简称“队”。 队列是一种先进先出(First In First Out)的 阅读详情

5W1H

5W:

  1. What ?有序线性表,但是插入和删除在线性表的两个不同端点进行
  2. Where ?任何资源受限的地方,比如食堂排队打饭的时候
  3. When ?任何资源受限的时侯,以前计算机只有一个CPU,进程需要排队进行运算
  4. Who ?任何资源受限的对象,比如搬家的蚂蚁,需要跟着前一只蚂蚁
  5. Why  ?资源受限

 

How?:

  1. 先进先出,FIFO

 

抽象数据类型(Abstract Data Type,ADT)

得有

  • 队列的头 front,正在打饭的小胖
  • 队列的屁股 rear,刚刚排上队的你

然后就是一些方法:

  • 创建队伍,指定这个队伍最多能排多少人  queue...
  • 队伍这么长,还能排下人吗? boolean...
  • 新来一个排队的小蜗,现在队伍满了吗?  boolean...
  • 小胖打饭结束,然后队列的头 front变成了小飞  queue ...
  • 现在排队打饭有多少人?boolean...

 

储存层面分类

逻辑层面就是上面阐述的这样,那储存层面呢?依旧还是分为

  1. 顺序存储
  2. 链式存储

 

顺序存储,同数组实现的两种方式

  • 方式一:食堂打饭,小胖打完饭,所有人都往前移动

缺点:队伍一直在移动,每个打饭的人都要动,其实就是删的话,资源开销大

可惜,方式一并不是队列的官方定义,官方定义是方式二

  • 方式二:小朋友在教室排好队(小朋友不移动),等着老师发苹果,老师是移动得给小朋友发苹果,小朋友得到苹果就跑去玩了,同时有新的小朋友入队

溢出现象:

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

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

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

教室没这么长啊,老师很可能从一端走到另一端,已经拿了苹果跑了的小盆友原来站的地方的空间是浪费的:假溢出

解决办法:去操场吧,我老师大不了围着操场转圈圈嘛,循环队列

 

 

循环队列

但循环队列有一个问题,

队列空的时候:头的位置==屁股的位置

队列满的时候:头的位置==屁股的位置

空or满?咋判断

也是两个方案:

  1. ADT里再加一个变量:记录当前队列的Size
  2. 少用数组的一个元素:

假设数组大小是n,那我队列的大小m就是n-1

  1. 队列空的时候:头的位置==屁股的位置

    队列满的时候:(屁股的位置+1)%m ==头的位置

 

案例实现

采用顺序存储(数组),性能好的方式(老师移动),循环队列(操场),少用数组的一个元素

自己脑补的例子:

假设圆形操场是5个格子,小刘老师在第1个格子,给小朋友发苹果,,小朋友排好队(小朋友不移动),等着老师发苹果,老师是移动的给小朋友发苹果,小朋友得到苹果就跑去玩了。

规则是:先来一个老师,然后来三个小朋友排队,撤一个小朋友,来三个小朋友排队,撤一个小朋友,依次循环。老师算0号学生,小朋友学号从1号开始

问,当操场满的时候,小刘老师的位置,此时几号小朋友等待着领取苹果,几号小朋友在队伍的最后面,几号小朋友刚好被挤出插不进队伍

分析:

操场5个格子,老师就是队列的头

这个老师,不是队列的头,老师可不会被剔除,我居然忘记考虑了,所以这个不是普通的循环队列!!!!!!!!!!!!!!!!!!!!!!!!!!!

因为老师不属于队列,所以队列的大小是4,而数值需要留一个位置来判断,再加上老师占了一个位置,所以数组的大小是4+1+1=6

 

学生类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

public class Student {
    private String name;
    private int id;

}

队列:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

public class Queue {
    //正常应该用ArrayList存学生对象,但是我们用的数组,所以存的是学生的学号
    public int[] queueArray;
    private int maxSize;
    private int front;//front指的是老师,front的下一个才是队列的头
    private int rear;

    public Queue(int max){
        maxSize=max+1;//数组要比队列大1位,还有一个老师,所以是6位
        queueArray=new int[maxSize];
        front=0;
        rear=0;
    }

//    队列满的时候:(屁股的位置+2)%m ==头的位置
    public boolean isFull(Queue queue){
        return (queue.rear+2)%(maxSize)==queue.front ? true:false ;
    }


//    队列空的时候:头的位置==屁股的位置
    public boolean isEmpty(Queue queue){
        return queue.front==queue.rear ? true:false ;
    }


    public boolean add(Queue queue,int i){
        if(isFull(queue)) return false;
        else{
            rear=(rear+1)%(maxSize);
            queueArray[rear]=i;
            return true;
        }
    }


    public void delete(Queue queue){
        if(isEmpty(queue)) {
            System.out.println("错误,没有元素给你删");
        }
        else {
            front= (front+1)%(maxSize);
            queueArray[front]=-2;//把原先的元素删了,-2就表示值为空
        }
    }


}



 

 

 

import java.util.ArrayList;

public class Exe {
    public static void main(String[] args) {

        ArrayList<Student> student=new ArrayList();

        student.add(new Student("学生0号,即老师",0));

        for (int i = 1; i <1000; i++) {
            student.add(new Student("学生"+i+"号",i));
        }


        int MaxSize=5;//操场能站下5个人,其中一个是老师,那么队列长度是4
        Queue queue=new Queue(MaxSize);

         //进三个同学,撤一个同学
        int j=1;
        System.out.print("开始前front = " + queue.getFront()+"     ");
        System.out.println("rear = " + queue.getRear());
        while(!queue.isFull(queue)){
            for (int i = 0; i <3 ; i++) {
                if(!queue.add(queue,student.get(j++).getId())) {
                    j--;
                    break;
                }

            }
            if(!queue.isFull(queue)) {
                queue.delete(queue);
                j++;
            }
        }
        System.out.print("满的时候front = " + queue.getFront()+"     ");
        System.out.println("rear = " + queue.getRear());
        System.out.println("队列头学生的格子"+queue.getFront()+1);
        System.out.println("队列头学生的名字"+student.get(queue.getFront()+1).getName());
        System.out.println("队列尾学生的格子"+queue.getRear());
        System.out.println("队列尾学生的名字"+student.get(queue.getRear()).getName());
        System.out.println("老师的位置是"+(queue.getFront()));
    }
}

 

 

 

 

 

 

 

链式存储

 

案例实现

待更新

 

 

 

 

 

 

 

c语言建立队列(顺序队列、循化队列和链式队列) c语言建立队列 一、顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二、如何解决"假上溢"问题 三、循环队列 循环队列说明 循环队列的实现方法 1、设置一个标记以区别队列是空还是满 2、使用一个计数器记录队列中元素的总数 3、保留对空条件,修改队满条件(常用) 循化队列的存储结构定义 初始化队列 设置标志 入队操作 出队操作 设置计数器方法 入队操作 出队操作 方法三 入队操作 出队操作 其余操作 四、链式队列 说明 链式存储结构 入队操作 出队操作 其余操作 阅读详情

相关推荐

队列,顺序队列,循环队列,链式队列

为了解决“假溢出”现象,使得队列的存储空间得到充分利用,一个巧妙的方法就是将顺序队列的数组看成一个头尾相接的循环结构。队列的头尾相接的顺序存储结构称为循环队列。题:当循环对列为空或满时,都是队尾指针等于队头指针,即rear==front。当rear==front时,该是判满还是判空呢?解决方案:方案一:设置一个计数器,开始时计数器设为0,新元素入队时,计数器加1,元素出队,计数器减1。当计数器==MAXSIZE时,队满;计数器==0时,队空。

qq_43389859的博客 1282

数据结构——队列

数据结构——队列

Dirty_artist的博客 772

顺序队列/链式队列

        队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。        与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列        顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数...

sandmm112的博客 2760

【数据结构】队列详解

🌸作者简介:目前正在学习C语言和数据结构。

fighting小泽的博客 4445

C++队列、双向队列、单调队列

队列(Queue)是一种基本的线性数据结构,它遵循先进先出(First In First Out, FIFO)的原则。这意味着最先被添加到队列中的元素将会是最先被移除的。和生活中,无人插队的队列一样。队列内部实现可能是连续空间,也可能是多段空间。

闻缺陷则喜何志丹 3604

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 410

队列(Queue)

链式结构和顺序结构(设计循环队列习题)的实现队列 双端队列 常见面试题:队列实现栈和栈实现队列

学习日记 1282

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6206

【数据结构】带你认识队列--Queue

通过以上介绍,我们了解了队列的基本概念和实现方法,并实现了队列的初始化、判断是否为空、入队、出队、遍历等基本操作。队列作为一种常见的数据结构,在计算机科学中有着广泛的应用,特别是在广度优先搜索、任务调度等场景。希望这篇文章能够帮助你更好地理解和使用队列。

Z1tai的博客 3469

Linux ELF文件解析:从file到readelf的完整工具链指南

ELF(可执行与可链接格式)是Linux系统中二进制文件的标准格式,定义了程序加载、内存布局和元数据组织方式。其核心原理在于通过程序头表描述执行视图、节区头表描述链接视图,实现代码与数据的结构化存储。这一格式的技术价值在于为程序调试、安全审计和性能优化提供了底层支持,尤其在动态链接、符号解析和内存保护机制中发挥关键作用。在应用场景上,系统管理员依赖ELF分析工具解决库依赖问题,安全研究员通过检查安全属性评估漏洞风险,开发者则利用反汇编进行代码调试。本文聚焦于file、readelf、objdump等工具链的

weixin_42691065的博客 635

Isaac Lab强化学习实战:用SO-ARM101机械臂实现抓取任务(附B站视频教程)

本文详细介绍了如何使用Isaac Lab强化学习框架,在SO-ARM101机械臂上实现抓取任务的完整实战流程。内容涵盖从环境搭建、奖励函数设计、训练调参到模型部署的各个环节,并分享了Sim-to-Real迁移的关键技巧,旨在帮助开发者高效完成机器人强化学习项目。

weixin_29070721的博客 1105

队列的介绍

使用数组模拟队列会导致一个问题:随着时间的推移,整个队列会向数组的尾部移动,一旦到达数组的最末端,即使数组的前端还有空闲位置,再进行入队操作也会导致溢出(这种数组里实际有空闲位置而发生了上溢的现象被称为「假溢出」)。队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。解决假溢出的办法是采用循环的方式来组织存放队列元素的数组,即将数组下标为 0 的位置看做是最后一个位置的后继。双端队列是指一个可以在队首/队尾插入或删除元素的队列。通常用一个数组模拟一个队列,用两个变量标记队列的首尾。

twc20070402的博客 284

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

队列(顺序队列,循环队列,链式队列)超详细讲解

本文是队列(包括顺序队列,循环队列,栈式队列的详细讲解)

m0_56992713的博客 5722

抑制电磁干扰(EMI)的实用电路技术

抑制电磁干扰(EMI)的实用电路技术 qtFK_EMC_EMI 【导读】本系列文章的第 1 部分至第 4 部分详细介绍了开关电源稳压器引起的传导发射和辐射发射,包括噪声产生机制、测量要求、频率范围、适用的测试限值、传播模式和寄生效应。在第 5 部分中,我将基于这一理论基础介绍抑制电磁干扰 (EMI) 的实用电路技术。 一般来说,电路原理图和印刷电路板 (PCB) 对于实现出色的 EMI 性能至关重要。第 3 部分重点强调通过谨慎的元器件选型和 PCB 布局尽量减小“功率回路”寄生电感的重要性。电源转换

学海无涯的专栏 1192

【Windows Server 2019】Active Directory Certificate Services 证书颁发机构的安装,配置和管理Ⅰ——AD CS的安装和配置

博文主要介绍了Windows Server 2019的证书颁发机构的安装和配置方法。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 4833

队列文档之双端队列

双端队列是普通队列的扩展,是指允许两端都可以进行入队和出队操作的队列(即可以在队头进行入队和出队操作,也可以在队尾进行入队和出队操作的队列)。

二木成林 1万+

paddlehub无法安装,安装报错【Bug完美解决】

paddlehub无法安装,安装报错【Bug完美解决】 我们正在进行一个基于Python的项目开发,该项目需要集成PaddleHub,以利用其丰富的深度学习模型和工具。PaddleHub提供了一种简便的方式来使用预训练模型,以加速开发过程并提高模型效果。 现在paddlehub安装出现问题了,本文彻底解决paddlehub无法安装的问题。

一键难忘的博客 3388

队列——顺序队列和链式队列

队列是一种遵循先进先出(FIFO)原则的线性表,仅允许在队尾插入、队头删除。其核心体现在缓冲协调(平衡速度差异)、延时任务管理(如订单超时处理)、多线程协作(阻塞队列)及LRU缓存淘汰等场景。顺序队列用数组实现,存在“假溢出”问题,通过循环队列解决,牺牲一个存储单元以(rear+1)%MAX_SIZE==front判断队满,front==rear判队空。链式队列基于链表,动态分配内存,无溢出风险,入队时尾插新节点,出队删除队头节点并释放内存,通过front和rear指针维护队列状态,适用于长度不确定的场景。

2503_92090935的博客 2223

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

阻塞队列,有界队列,无界队列

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。 使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用自旋+CAS的方式来实现。 基本概念 阻塞队列与非阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法offer:当队列满时,队列会阻塞插入元素的线程,直到队列不满

morris 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java队列实现(顺序队列、链式队列、循环队列)

1.顺序队列的实现 package lang; import java.io.Serializable; import java.util.Arrays; /** * @ClassName: ArrayQueue * @Description: 顺序队列 * @date 2014年1月20日 下午3:46:19 * @param */ public clas

jiutianhe的专栏 4万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

队列的使用及实现队列

队列的使用及实现队列的概念普通队列 Queue双端队列 Deque循环队列队列的使用插入元素 add offer删除元素 remove poll得到队头元素 element peek双端队列的使用插入删除得到队头队尾元素实现队列实现 Node定义队头和队尾向队列当中增加元素判断是否为空在队列当中弹出元素得到队头元素测试循环队列计算循环队列的下标图示第三种方法实现循环队列初始化入队判满判空出队得到队头元素得到队尾元素测试: 队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,

sjp151的博客 5706

队列以及队列的应用

队列 队列的定义 生活中可能有很多种需要排队的场景,比如中午去食堂打饭,需要排队,排在队头的同学肯定是先去的,所以先打上饭。计算机中也有很多这样的场景,比如作业调度系统,如果同时来几个任务都需要用到输入输出系统,但是输入输出设备只有一套,谁先用呢,也是谁先来谁用,也需要排队。再比如我们的锁机制,如果出现多线程竞争同一把锁,那么同时只有一个线程获得了锁资源,剩下的线程怎么办呢,那如果是公平锁,肯定也是排队,等锁被释放了,那个最先来的线程优先获得锁资源。 那么根据上面的说法我们也大概了解了什么是队列。把他从生活

阿星的博客 5210

队列的基本操作(顺序队列、循环队列、链式队列)

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 队列也是一种线性表,是一种先进先出的线性结构。队列只允许在表的一端进行插入(入队)、删除(出队)操作。允许插入的一端称为队尾,允许删除的一端称为队头。 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;队列的基本操作包括: 初始化队列:InitQueue(Q) &amp;nbsp; &

Keep Fighting All The Time 5万+

数组队列——循环队列

首先要明确队列的特点,先进先出,对头出队,队尾进队。其次通过数组对列探究对列的特性中设置了许多表示下标的变量,通过移动变量位置来实现入队出队;但实际上数组的值还是存在,只不过获取数据是通过arr[front]来获取。在研究普通数组队列时我们发现一旦队列满就再也无法存储数据的问题,因此出现了循环队列,通过取模来防止数组越界以此重复利用数组,只要出队取数据,保证数组队列中有空间,便可再次存数据,因此解决了这个问题。

include_java0的博客 1952
上一篇: mac系统下.m2文件在哪里
下一篇: SpringBoot是怎么运行的?
a-bit
博客等级 码龄10年 16粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值