数据结构:队列及其应用

news2024/11/17 3:24:29

队列(Queue)是一种特殊的线性表,它的主要特点是先进先出(First In First Out,FIFO)。队列只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作。以下是对队列的详细介绍:

一、基本概念

  • 队列的定义:队列是一种只允许在表的一端(队尾)进行插入操作,在另一端(队头)进行删除操作的线性表
  • 队头(Front):队列中允许删除的一端,又称为队首。
  • 队尾(Rear):队列中允许插入的一端。
  • 空队列:不包含任何元素的队列。

二、队列的主要操作

队列的主要操作包括入队(Enqueue)、出队(Dequeue)、查看队头元素(Peek/Front)和判断队列是否为空(IsEmpty)等。

  • 入队(Enqueue):在队列的队尾插入一个新元素。
  • 出队(Dequeue):从队列的队头删除一个元素,并返回该元素的值。
  • 查看队头元素(Peek/Front):返回队列队头元素的值,但不删除该元素。
  • 判断队列是否为空(IsEmpty):如果队列中没有任何元素,则返回true;否则返回false。

三、队列的分类(存储结构)

队列根据实现方式的不同,可以分为多种类型,如顺序队列、循环队列、链式队列等。

  • 顺序队列
  • 使用数组实现的队列,队头和队尾指针分别指向队列的首尾元素。顺序队列在插入和删除操作时可能会出现“假溢出”现象,即队列未满但因指针限制无法继续插入元素的情况。

初始化:

//initialize
#define MaxSize 50
typedef struct
{
    int rear,front;//rear指向队尾元素的下一个值,front指向队头元素
    Elemtype data[MaxSize];
}SqQueue;
  • 循环队列
  • 为了解决顺序队列的“假溢出”问题,引入了循环队列。在循环队列中,当队尾指针到达数组末尾时,会自动回到数组的开始位置,形成一个环状结构。循环队列需要牺牲一个存储单元来区分队列空和队列满的状态。

初始:front=rear=0;

队首指针进1:front=(front+1)%MaxSize

队尾指针进1:rear=(rear+1)%MaxSize

队长:(rear-front+Max Size)%MaxSize 

队空判断条件:

循环队列为空的判断条件相对简单,即队头指针(front)和队尾指针(rear)相等。这是因为当队列为空时,没有元素被插入,所以队头和队尾都指向数组的起始位置(或某个约定的初始位置)。

队空判断条件front == rear

队满判断条件:

循环队列为满的判断条件则较为复杂。由于队尾指针在达到数组末尾后会回到数组开头,因此当队尾指针再次指向队头指针时,队列可能已满,也可能为空。为了区分这两种情况,通常采用以下几种方法之一来判断队列是否满:

  1. 牺牲一个元素空间
    这是最常见的方法。在循环队列中,约定当(rear + 1) % MaxSize == front时,认为队列已满。这里,MaxSize是队列所使用数组的大小,%是取模运算符。这种方法通过牺牲数组中的一个元素空间来区分队列满和队列空的状态。当(rear + 1) % MaxSize == front时,虽然从逻辑上看队尾指针和队头指针相邻,但实际上队列中还有一个空位置没有被使用,因此认为队列已满。

    队满判断条件(牺牲一个元素空间)(rear + 1) % MaxSize == front

         队空判断条件front == rear

   队长:(rear-front+MaxSize)%MaxSize

  1. 增设计数器或标志位:(size)
    另一种方法是增设一个计数器(记录队列中元素的数量)或标志位(记录队列的当前状态,如是否进行过插入或删除操作)。然而,这种方法需要额外的存储空间,并且增加了操作的复杂性。队空:size=0;  队满:size=maxSize;

  2. 改变front和rear的定义域
    还有一种较为特殊的方法是通过改变front和rear的定义域来区分队列满和队列空的状态。例如,可以约定front的初始值为数组的最大索引加1(或某个大于数组最大索引的值),而rear的初始值为0。这样,当front等于rear时,队列为空;而当rear再次等于front时(在循环过程中),队列满。但这种方法在实际应用中较为少见,因为它改变了front和rear的常规用法。

综上所述,循环队列队空和队满的判断条件主要取决于所采用的具体实现方法。其中,“牺牲一个元素空间”的方法因其简单性和高效性而被广泛采用。

图解:

代码: 
//initialize
void InitQueue(SqQueue &Q){
    Q.front=Q.rear=0;
}
//判断是否为空
bool isEempty(SqQueue Q){
    if(Q.rear===Q.front)
    return true;
    else
    return false;

}
//入队
bool EnQueue(SqQueue &Q,Elemtype x){
    if ((Q.rear+1)%MaxSize==Q.front)
    return false; 
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
        
}
//出队
bool DeQueue(SqQueue &Q,Elemtype &x){
    if(Q.front==Q.rear)
    return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
    return true;
}
  • 链式队列
  • 使用链表实现的队列,每个节点包含数据域和指向下一个节点的指针。链式队列在插入和删除操作时不需要移动元素,具有较好的灵活性。
代码:
//
typedef struct{
    Elemtype  data;
    struct LinkNode *next;
}LinkNode;
typedef struct
{
    LinkNode *rear,*front;
}LinkQueue;

//initialize
void InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点
    Q.front->next=NULL;
}

bool IsEmpty(LinkQueue Q){
    if(Q.front==Q.rear)
    return true;
    else
    return false;
}

void EnQueue(LinkQueue &Q,ElemType e){
    LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=e;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}

void DeQueue(LinkQueue &Q,ElemType &e){
    if(Q.front==Q.rear)
    return false;
    LinkNode *s=Q.front->next;
    e=s->data;
    Q.front->next=s->next;
    if(Q.rear==s)//队列中只有一个结点
    Q.front=Q.rear;//删除后变空
    free(s);
    return true;
}
双端队列:

1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的是4,1,3,2。

2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的是4,2,1,3。

3)既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的是4,2,3,1。

四、队列的应用场景

队列在实际应用中有着广泛的应用,如:

  • 任务调度:在多任务系统中,可以使用队列来存储待执行的任务,系统按照队列中的顺序依次执行任务。
  • 消息传递:在分布式系统中,队列可以用作消息传递的媒介,发送方将消息发送到队列中,接收方从队列中取出消息并进行处理。
  • 缓存淘汰:在缓存系统中,可以使用队列的先进先出特性来淘汰最早进入缓存的数据项。
  • 并发控制:在多线程或多进程环境中,队列可以用于控制对共享资源的访问顺序,防止数据竞争和死锁等问题。
队列在计算机系统中的应用

队列在计算机系统中的应用非常广泛,以下仅从两个方面来阐述:第一个方面是解决主机与外部设备之间速度不匹配的问题,第二个方面是解决由多用户引起的资源竞争问题。

缓冲区的逻辑结构(2009):


对于第一个方面,仅以主机和打印机之间速度不匹配的问题为例做简要说明。主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,因为速度不匹配,若直接把输出的数据送给打印机打印,则显然是不行的。解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依次写入这个缓冲区,写满后就暂停输出,转去做其他的事情。打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求。主机接到请求后再向缓冲区写入打印数据。这样做既保证了打印数据的正确,又使主机提高了效率。由此可见,打印数据缓冲区中所存储的数据就是一个队列。


多队列出队/入队操作的应用(2016):


对于第二个方面, CPU (即中央处理器,它包括运算器和控制器)资源的竞争就是一个典型的例子。在一个带有多终端的计算机系统上,有多个用户需要 CPU 各自运行自己的程序,它们分别通过各自的终端向操作系统提出占用 CPU 的请求。操作系统通常按照每个请求在时间上的先后顺序,把它们排成一个队列,每次把 CPU 分配给队首请求的用户使用。当相应的程序运行结束或用完规定的时间间隔后,令其出队,再把 CPU 分配给新的队首请求的用户使用。这样既能满足每个用户的请求,又使CPU能够正常运行。

五、总结

队列是一种重要的数据结构,它遵循先进先出的原则进行元素的操作。队列的实现方式多样,包括顺序队列、循环队列和链式队列等。队列在实际应用中有着广泛的应用场景,如任务调度、消息传递、缓存淘汰和并发控制等。通过合理使用队列,可以提高系统的性能和稳定性。

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

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

相关文章

Hadoop三大组件之YARN(一)

YARN架构与任务提交流程详解 1. YARN的组成架构 YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的一个重要组成部分,主要用于资源管理和调度。YARN的架构主要由以下几个关键组件构成: 1.1 ResourceManager&#xff…

vue3结合 vue-router和keepalive实现路由跳转保持滚动位置不改变(超级简易清晰)

1.首先我们在路由跳转页面设置keepalive(Seeall是我想实现结果的页面) 2. 想实现结果的页面中如果不是全屏实现滚动而是有单独的标签实现滚动效果

Spring Boot技术栈:打造高效在线商城

2 相关技术 2.1 Springboot框架介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring…

AI大模型对我国劳动力市场潜在影响研究报告(2024)|附19页PDF文件下载

前言 北京大学国家发展研究院与智联招聘日前联合发布《AI大模型对我国劳动力市场潜在影响研究》。该研究显示,2024年上半年,招聘职位数同比增速前五的人工智能职业,包括大语言模型方面的自然语言处理(111%)、深度学习…

STM32 RTC实时时钟学习总结

STM32 RTC实时时钟学习总结 写于2024/9/25下午 文章目录 STM32 RTC实时时钟学习总结1. 简介2. 流程框图介绍3. 相关寄存器介绍4. 代码解析 1. 简介 STM32F103 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff…

【C语言】动态内存管理:malloc、calloc、realloc、free

本篇介绍一下C语言中的malloc/calloc/realloc。 使用这些函数需要包含头文件<stdlib.h>。malloc/calloc/realloc申请的空间都是 堆区的。 1.malloc和free 1.1 malloc C语言提供了一个动态内存开辟的函数malloc&#xff0c;函数原型如下。 void* malloc(size_t size);…

实例讲解电动汽车故障限功限速控制策略及Simulink建模方法

电动汽车出现转向系统、制动系统及其他对车辆行车产生一定风险的故障&#xff0c;整车控制器判定为二级故障&#xff0c;功率限制为正常状态的50%&#xff0c;车速限制至20km/h。当车辆进入二级故障后&#xff0c;VCU需要根据故障处理机制进行限功限速控制。有关故障分级处理策…

基于php的在线租房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

DIDIDI~

1 最佳速通时间 小C准备参加某个游戏的速通比赛&#xff0c;为此他对该游戏速通了 n次&#xff0c;每次速通记录可以用一个数组 A{a1,a2……am}表示&#xff0c;其中a表示小C 从游戏开始到第i个游戏节点所花赛的时间&#xff0c;m 为游戏节点的个数。请根据小 C 的速通记录计算…

IP地址如何与网络虚拟化技术融合?

网络虚拟化技术简介 网络虚拟化是一种将物理网络资源抽象为逻辑网络资源的技术。它可以将一个物理网络划分为多个虚拟网络&#xff0c;每个虚拟网络都可以有自己独立的IP地址空间、路由策略和安全设置。网络虚拟化技术为企业和组织提供了更高的灵活性、可扩展性和安全性。 IP…

DCDC电源设计工具(软件)(一)—— WEBENCH(TI)

目录 一、简介 二、在线链接 三、设计界面介绍 1、首界面 2、芯片选择或芯片选型界面 3、根据参数选择芯片及设计 &#xff08;1&#xff09;参数输入界面 &#xff08;2&#xff09;芯片选型界面 &#xff08;3&#xff09;根据具体芯片型号选择设计 ①、芯片选择及参…

BAAI 团队发布多模态模型 Emu3

在人工智能的浩瀚海洋中&#xff0c;一艘名为Emu3的创新之船正在破浪前行&#xff0c;为我们展示了多模态AI的无限可能。这个由Meta AI研究团队开发的革命性模型&#xff0c;通过简单而巧妙的"下一步预测"机制&#xff0c;实现了文本、图像和视频的统一处理。 Emu3的…

Qt/C++ 解决调用国密SM3,SM4加密解密字符串HEX,BASE64格式转换和PKCS5Padding字符串填充相关问题

项目中遇到了需要与JAVA WEB接口使用SM3,SM4加密数据对接的需求&#xff0c;于是简单了解了下SM3与SM4加密算法在C环境下的实现。并使用Qt/C还原了在线SM3国密加密工具和在线SM4国密加密解密工具网页的示例功能的实现 目录导读 前言SM3算法简介SM4算法简介 实现示例字符串HEX,B…

防伪溯源查询系统V1.0.5

多平台&#xff08;微信小程序、H5网页&#xff09;二维码扫码输码防伪溯源查询系统&#xff0c;拥有强大的防伪码生成功能&#xff08;内置多种生成规则&#xff09;、批量导出防伪码数据、支持代理商管理端&#xff08;可批量对自己防伪码进行操作处理&#xff09;、文章资讯…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章&#xff1a;SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例&#xff1a; 我们都知道自…

一些超好用的 GitHub 插件和技巧

聊聊我平时使用 GitHub 时学到的一些插件、技巧。 ‍ ‍ 浏览器插件 在我的另一篇博客 浏览器插件推荐 里提到过跟 GitHub 相关的一些插件&#xff0c;这里重复下&#xff1a; Sourcegraph&#xff1a;在线打开项目&#xff0c;方便阅读&#xff0c;将 GitHub 变得和 IDE …

AI名词扫盲

本篇章主要介绍一些AI研究方向的名词以及解释&#xff0c;后续会持续补充&#xff0c;名词解释与时间顺序无关&#xff0c;欢迎各位大佬们在评论区查漏补缺。 目录 AI&#xff08;Artificial Intelligence&#xff0c;人工智能&#xff09;卷积神经网络&#xff08;CNN&#xf…

权威人工智能行业认证证书——计算机视觉工程师(中级)

随着人工智能技术的快速发展&#xff0c;越来越多的人开始关注并学习人工智能。然而&#xff0c;由于人工智能领域知识的复杂性和多样性&#xff0c;许多人往往会感到困惑&#xff0c;不知道该从何入手。这时&#xff0c;一份权威的人工智能行业证书可以帮助学习者更好地了解人…

SpringBoot3.X配置OAuth

背景 之前在学习OAuth2时&#xff0c;我就有一个疑惑&#xff0c;OAuth2中有太多的配置、服务类都标注了Deprecated&#xff0c;如下&#xff1a; 显然这些写法已经过时了&#xff0c;那么官方推荐的最新写法是什么样的呢&#xff1f;当时我没有深究这些&#xff0c;我以为我放…

Gartner 报告解读(二)| Open Telemetry可观测性解读与使用建议

上期跟大家解读了Gartner 成熟度曲线报告&#xff0c;主要分享了影响中国IT使用的4大因素--自主可控计划、AI发展趋势影响、降本增效、IT基础设施现代化程度。新来的朋友点这里&#xff0c;一键了解具体内容。 Gartner 成熟度曲线报告解读&#xff08;一&#xff09;| 2024中国…