24考研数据结构-队列2

news2024/11/23 10:49:06

目录

  • 数据结构之队列:链式存储结构与循环队列
    • 链式存储结构
      • 链式队列的结构
      • 链式队列的操作
    • 循环队列
      • 循环队列的结构
      • 循环队列的操作
    • 链式队列与循环队列的比较
    • 结论
    • 3.2.3 队列的链式存储结构
      • 3.2.3.1定义
      • 3.2.3.2链式队列的基本操作——带头结点
      • 3.2.3.3 不带头结点的相关操作
    • 3.2.4双端队列
      • 0. 限制输入输出问题(需要再验证)
      • 1.定义
    • 3.2.5循环队列

数据结构之队列:链式存储结构与循环队列

在计算机科学中,队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则,即最先入队的元素将最先出队。队列广泛应用于计算机系统中,例如任务调度、缓冲区管理等。在队列的实现中,链式存储结构和循环队列是两种常见的方法。本文将对这两种队列的实现方法进行介绍和比较。

链式存储结构

链式存储结构是通过链表来实现队列的一种方法。队列中的每个元素被封装成一个节点,节点之间通过指针链接在一起。链式队列允许动态地添加和删除元素,不需要事先定义队列的大小,因此具有较好的灵活性。

链式队列的结构

一个链式队列节点通常包含两个部分:

  • 数据域:用于存储节点所包含的数据。
  • 指针域(next):指向队列中下一个节点的指针。
struct QueueNode {
    int data;
    QueueNode* next;
};

链式队列的操作

链式队列支持多种操作,包括元素的入队和出队等。由于队列的元素在链表中动态存储,因此链式队列的大小可以根据实际需求进行调整,不会浪费内存空间。

循环队列

循环队列是一种使用数组实现的队列。与链式队列相比,循环队列具有固定大小,一旦队列的大小被定义,就无法动态扩展。循环队列通过“头指针”和“尾指针”来实现循环存储,当队列满时,新元素将覆盖最先入队的元素,实现循环使用队列空间。

循环队列的结构

循环队列通常包含以下几个部分:

  • 数据数组:用于存储队列中的元素。
  • 头指针(front):指向队列头部的位置。
  • 尾指针(rear):指向队列尾部的下一个位置。
#define MAX_SIZE 100

class CircularQueue {
private:
    int data[MAX_SIZE];
    int front;
    int rear;

public:
    CircularQueue();
    bool isEmpty();
    bool isFull();
    void enqueue(int value);
    int dequeue();
};

循环队列的操作

循环队列支持多种操作,包括元素的入队和出队等。由于队列是循环使用数组空间,因此入队和出队操作需要更新头指针和尾指针,并考虑数组下标的循环。

链式队列与循环队列的比较

链式队列和循环队列是两种不同的队列实现方式,它们各自具有优势和适用场景。

链式队列的优势:

  • 动态大小:链式队列可以根据实际需求动态调整大小,不会浪费内存空间。
  • 灵活性:链式队列允许动态添加和删除元素,操作更加灵活。

循环队列的优势:

  • 固定大小:循环队列使用数组实现,具有固定大小,不会频繁申请和释放内存,效率较高。
  • 循环利用:循环队列通过循环使用队列空间,可以有效地利用数组空间,减少内存碎片。

结论

链式存储结构和循环队列是两种常见的队列实现方法。在选择使用哪种队列实现时,需要根据具体的应用场景和操作需求来进行判断。无论是链式队列还是循环队列,队列数据结构在计算机科学中扮演着重要的角色,为我们提供了高效管理数据的方法。

3.2.3 队列的链式存储结构

3.2.3.1定义

1.定义:队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。
链队列:用链表表示的队列,是限制仅在表头删除和表尾插入的单链表。
队列的链式存储类型可描述为:

typedef struct LinkNode{      //链式队列结点
    ElemType data;
    struct LinkNode *next;
}

typedef struct{               //链式队列
    LinkNode *front, *rear;   //队列的队头和队尾指针
}LinkQueue;


3.2.3.2链式队列的基本操作——带头结点

在这里插入图片描述

  • 初始化 & 判空
void InitQueue(LinkQueue &Q){
    //初始化时,front、rear都指向头结点
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front -> next = NULL;
}

//判断队列是否为空
bool IsEmpty(LinkQueue Q){
    if(Q.front == Q.rear)     //也可用 Q.front -> next == NULL
        return true;
    else
        return false;
}
  • 入队操作
//新元素入队 (表尾进行)
void EnQueue(LinkQueue &Q, ElemType x){
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //申请一个新结点
    s->data = x;
    s->next = NULL;     //s作为最后一个结点,指针域指向NULL
    Q.rear->next = s;   //新结点插入到当前的rear之后
    Q.rear = s;         //表尾指针指向新的表尾
}


  • 出队操作
//队头元素出队
bool DeQueue(LinkQueue &Q, ElemType &x){
    if(Q.front == Q.rear)
        return false;                    //空队
    
    LinkNode *p = Q.front->next;         //p指针指向即将删除的结点 (头结点所指向的结点)
    x = p->data;
    Q.front->next = p->next;             //修改头结点的next指针
    if(Q.rear == p)                      //此次是最后一个结点出队
        Q.rear = Q.front;                //修改rear指针
    free(p);                             //释放结点空间

    return true;
}

在这里插入图片描述

  • 队列满的条件
    顺序存储:预分配存储空间
    链式存储:一般不会队满,除非内存不足

  • 计算链队长度 (遍历链队)
    设置一个int length 记录链式队列长度


3.2.3.3 不带头结点的相关操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.4双端队列

0. 限制输入输出问题(需要再验证)

对于双端队列的限制输出以及输出问题,做以下考虑

  • 限制输入的,就意味着单边输入,注意输入顺序,怎么输入就怎么按照什么顺序写下去,再去左右判断是否可以输出
  • 限制输出的,就意味着单边输出,注意输出顺序,按照输入顺序的第一个,选项中左右寻找临近的输入顺序,找得到则合法

1.定义

双端队列是指允许两端都可以进行入队和出队操作的队列

  • 双端队列允许从两端插入、两端删除的线性表;
  • 如果只使用其中一端的插入、删除操作,则等同于栈;
  • 输入受限的双端队列:允许一端插入,两端删除的线性表;
  • 输出受限的双端队列:允许两端插入,一端删除的线性表;

栈合法的序列,双端序列也合法(只用一边就是一个栈),所以只要考虑不合法的那些

3.2.5循环队列

在这里插入图片描述

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

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

相关文章

PLC自学是否可行?

plc编程的关键是模拟原操作流程,通过运行程序完成控制过程。所以核心内容就是程序对流程的描述。因此,掌握PLC编程语言和基本功能实现是很有必要的。 PLC语言分为梯形图、语句和功能图。常用梯形图,适合基本逻辑描述,语句表适合数…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

商品分类子类新建,手机云进销存,扫码入库出库盘点开单打印

商品分类子类新建,手机扫码开单打印进销存,商贸批发生产企业仓库条码管理软件系统,超市便利店五金茶叶烟酒鞋帽门店零售手机收银管理软件APP_哔哩哔哩_bilibili商品分类子类新建的操作步骤。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 …

Java基础---final 关键字

目录 定义: 用途: 使用注意事项: final 变量 final 方法 final 类 小结 定义: Java中,final 表示最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思 用途&#xff…

springboot+mybatis多数据源的事务问题

1.springbootmybatis实现多数据源后,针对单个数据源我们可以使用Transactional(name"xxxTransactionManager") 来指定使用的事务管理器,但是如果被注解的方法需要同时支持两个事务管理器呢,这个时候如果用Transactional注解就不 …

设备数字化平台在制药行业数字化转型的思考与实践

近年来,全球制药行业正面临着数字化转型的浪潮。制药4.0的概念正引领着工业物联网、机器人流程自动化和人工智能等先进技术在制药行业的广泛应用。然而,尽管数字化转型在许多行业已经取得了巨大成功,制药行业仍然面临一些挑战。数据孤岛、人才…

git撤销上一次的commit

一行命令 git reset --soft HEAD^如果在vscode上面,就可以

路灯防雷测试标准方案

路灯作为城市照明的重要组成部分,不仅影响着城市的美观和安全,也涉及到城市的节能和环保。因此,路灯的质量和性能是非常重要的。而路灯由于其安装位置和工作环境的特殊性,很容易受到雷击的影响,导致路灯的损坏或故障。…

Sanic 是什么?从原理到实践,全面解析 Sanic 框架的奥秘

在 Python 中,有许多 Web 框架可以帮助开发者构建高性能的异步 Web 应用程序。其中,Sanic 是一款基于 Python 的异步 Web 框架,它提供了快速、简洁和灵活的方式来构建高性能的 Web 应用程序。本文将介绍 Sanic 框架的基本概念、特点和优势&am…

忘记安卓图案/密码锁如何解锁?

如何解锁Android手机图案锁?如何删除忘记的密码?Android 手机锁定后如何重置?这是许多智能手机用户在网上提出的几个问题。为了回答这些问题,我们想出了一些简单有效的方法来解锁任何设备而不丢失数据。 忘记手机密码可能会令人恐…

知网G4《课堂内外》期刊点评_投稿邮箱

知网G4《课堂内外》期刊点评_投稿邮箱 《课堂内外》青少年系列期刊因质量一流、发行争先、力创优秀青少年媒体品牌而备受读者喜爱和社会关注。同时为广告诉求、信息传递构筑起一个面向学生、家庭、学校的高效率低成本(CPM)的传媒平台。 主管单位 重庆市…

中国国际视听大会即将在北京召开,国产8K影视品牌齐聚

由国家广播电视总局、北京市人民政府指导,北京市广播电视局、北京经济技术开发区管委会主办的中国(北京)国际视听大会(CIAC)于2023年8月3日至6日在北京亦创国际会展中心举行。博冠光电作为国产8K摄像机先行者受邀参与&…

支配树学习笔记

学习链接【学习笔记】支配树_cz_xuyixuan的博客-CSDN博客 主要的求法是最后两个结论: 定理4用来求sdom,先搞一个dfs树,然后将点按dfs序从大到小加入,对每个点维护到当前根(即已加入点)路径上sdom最小是哪个…

物联网场景中的边缘计算解决方案有哪些?

在物联网场景中,边缘计算是一种重要的解决方案,用于在物联网设备和云端之间进行实时数据处理、分析和决策。HiWoo Box作为工业边缘网关设备,具备边缘计算能力,包括单点公式计算、Python脚本编程以及规则引擎,它为物联网…

《Kubernetes故障篇:unable to retrieve OCI runtime error》

一、背景信息 1、环境信息如下: 操作系统K8S版本containerd版本Centos7.6v1.24.12v1.6.12 2、报错信息如下: Warning FailedCreatePodSandBox 106s (x39 over 10m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: …

python语句学习系列(2)--读取.dat文件

系列文章目录 文章目录 系列文章目录前言1、引入库2、读取dat文件3、输出行列数控制(省略号去除)4、只显示前/后几行5、保存为Excel总结 前言 1、引入库 import pandas as pd import numpy as np import sys2、读取dat文件 2.1、第一种读取 df pd.read_table(r"E:\p…

FastText使用介绍

FastText概念介绍 FastText 是一个由 Facebook 开发的用于文本分类和向量化的开源工具,它是 Word2Vec 的一个拓展,能够处理词汇中的子词信息。FastText 基于神经网络模型,可以将词语表示为高维向量,并且保留了词汇中的语义信息。…

亚马逊美国站暖风机UL1278测试报告

取暖器是指用于取暖的设备,取暖设备根据加热介质不同、加热原理不同,大体可以分为:燃气取暖设备、电加热取暖设备、锅炉取暖设备、电壁挂炉取暖。但一般这类产品要上架美国亚马逊平台都必须要办理UL1278测试报告。 一、UL1278标准适用产品范围…

vscode搭建用ASP文件测试开发的环境

下载iis express安装包,iis express下载链接:Download Internet Information Services (IIS) 10.0 Express from Official Microsoft Download Center ​ 不适合的可以下载旧的iis express版本,系统没有相适应的.Net版本的还要下载。 安装完…

Java 版 spring cloud +spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…