24考研数据结构-队列1

news2024/9/24 11:25:36

目录

3.2队列(Queue)

3.2.1队列的基本概念

  1. 定义:队列(Queue)简称队,是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
  2. 特点
  • 队列是操作受限的线性表,只允许在一端进行插入 (入队),另一端进行删除 (出队)
  • 操作特性:先进先出 FIFO
  • 队头:允许删除的一端
  • 队尾:允许插入的一端
  • 空队列:不含任何元素的空表
  1. 队列的基本操作
  • “创建&销毁”

InitQueue(&Q): 初始化队列,构造一个空列表Q
DestroyQueue(&Q): 销毁队列,并释放队列Q所占用的内存空间

  • “增&删”

EnQueue(&Q, x): 入队,若队列Q未满,将x加入,使之成为新的队尾
DeQueue(&Q, &x): 出队,若队列Q非空,删除队头元素,并用x返回

  • “查&其他”

GetHead(Q,&x): 读队头元素,若队列Q非空,则将队头元素赋值给x
QueueEmpty(Q): 判队列空,若队列Q为空,则返回

3.2.2队列的顺序存储结构

队头指针:指向队头元素
队尾指针:指向队尾元素的下一个位置

3.2.2.1 队列存储的基本操作

//队列的顺序存储类型
# define MaxSize 10;     //定义队列中元素的最大个数
typedef struct{
    ElemType data[MaxSize];   //用静态数组存放队列元素
                              //连续的存储空间,大小为
                              //MaxSize*sizeof(ElemType)
    int front, rear;          //队头指针和队尾指针
}SqQueue;

//初始化队列
void InitQueue(SqQueue &Q){
    //初始化时,队头、队尾指针指向0
    Q.rear = Q.front = 0;
}

void test{
    SqQueue Q;                //声明一个队列
    InitQueue(Q);
    //...
}

// 判空
bool QueueEmpty(SqQueue 0){
    if(Q.rear == Q.front)    //判空条件
        return true;
    else 
        return false;
}


  1. 用静态数组存放队列元素,连续的存储空间,大小为MaxSize*sizeof(ElemType)
  2. int front, rear; //队头指针和队尾指针
  3. if(Q.rear == Q.front) //判空条件

用int类型表示数据在队伍的相对位置,相当于用数组的下标来表示元素的位置
front指向队头元素,rear指向下一个空缺的位置

在这里插入图片描述

3.2.2.2 循环队列 基本操作和判空方式 \color{Red}{基本操作和判空方式} 基本操作和判空方式

定义:将循环队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。
基本操作

a%b == a除以b的余数

初始:Q.front = Q.rear = 0;

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

队尾指针进1:Q.rear = (Q.rear + 1) % MaxSize —— 队尾指针后移,当移到最后一个后,下次移动会到第一个位置

队列长度:(Q.rear + MaxSize - Q.front) % MaxSize


重点是这个循环队列的判断空的方式,以下是几种方式,这些方式都是为了与 \color{Red}{重点是这个循环队列的判断空的方式,以下是几种方式,这些方式都是为了与} 重点是这个循环队列的判断空的方式,以下是几种方式,这些方式都是为了与
队列的判空条件 Q . f r o n t = Q . r e a r ;区分开 \color{Red}{队列的判空条件Q.front = Q.rear;区分开} 队列的判空条件Q.front=Q.rear;区分开

方案一: 牺牲一个单元来区分队空和队满
队尾指针的再下一个位置就是队头,即 (Q.rear+1)%MaxSize == Q.front

在这里插入图片描述

循环队列——入队:只能从队尾插入(判满使用方案一)

bool EnQueue(SqQueue &Q, ElemType x){
    if((Q.rear+1)%MaxSize == Q.front)        //队满
        return false;
    Q.data[Q.rear] = x;                      //将x插入队尾
    Q.rear = (Q.rear + 1) % MaxSize;         //队尾指针加1取模

    return true;
}

循环队列——出队:只能让队头元素出队

//出队,删除一个队头元素,用x返回
bool DeQueue(SqQueue &Q, ElemType &x){
    if(Q.rear == Q.front)              //队空报错
        return false;  

    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize; //队头指针后移动

    return true;
}

循环队列——获得队头元素

bool GetHead(SqQueue &Q, ElemType &x){
    if(Q.rear == Q.front)              //队空报错
        return false;  

    x = Q.data[Q.front];
    return true;
}

方案二: 不牺牲存储空间,设置size
定义一个变量 size用于记录队列此时记录了几个数据元素,初始化 size = 0,进队成功 size++,出队成功size--,根据size的值判断队满与队空

队满条件:size == MaxSize

队空条件:size == 0
1

# define MaxSize 10;     
typedef struct{
    ElemType data[MaxSize];   
    int front, rear;        
    int size;               //队列当前长度
}SqQueue;

//初始化队列
void InitQueue(SqQueue &Q){
    Q.rear = Q.front = 0;
    size = 0;
}

方案三: 不牺牲存储空间,设置tag
定义一个变量 tag,tag = 0 --最近进行的是删除操作;tag = 1 --最近进行的是插入操作;

每次删除操作成功时,都令tag = 0;只有删除操作,才可能导致队空
每次插入操作成功时,都令tag = 1;只有插入操作,才可能导致队满
队满条件:Q.front == Q.rear && tag == 1
队空条件:Q.front == Q.rear && tag == 0

在这里插入图片描述

# define MaxSize 10;     
typedef struct{
    ElemType data[MaxSize];   
    int front, rear;        
    int tag;               //最近进行的是删除or插入
}SqQueue;

3.2.2.3 知识回顾

在这里插入图片描述

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

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

相关文章

解读RSAC 2021丨灵魂拷问:你的网络够“皮实”吗?

美国时间5月20日,RSA大会落下帷幕。大会虽已结束,讨论还在继续。对于大会的主题“Resilience”,每个厂商、每个人都有自己的解读。 山石网科新技术研究院全程关注RSA大会,对于“Resilience”,他们的解读简单易懂接地气…

Java面向对象 - 常用类——Object类

什么是Object类 Java中有一个比较特殊的类,就是 Object类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承 Object类。因此,Object 类是 Java 类层中的最高层类&#x…

【C语言进阶篇】指针都学完了吧!那回调函数的应用我不允许还有人不会!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言💬 函数指针数组💭 函数指针数组的定义💭 函数指针数组的…

Android性能优化之游戏引擎初始化ANR

近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 ja…

Java Servlet实现下拉选择查询(双表)和单列模式

0目录 1.Servlet实现下拉选择查询(双表) 2.单列模式 1.Servlet实现下拉选择查询(双表) 新建数据库和表 实体类 接口方法 实现接方法 Servlet类 Web.xml List.jsp 页面效果 加入功能 2.单列模…

批发零售进销存哪个好?盘点5款主流批发零售进销存软件!

在我看来,几乎没有批发零售行业不需要做进销存管理,哪怕是路边一个小摊贩,也需要做进销存管理,但是传统的进销存过程中存在很多问题: 前后方协作困难:采购/销售/财务工作相互独立,工作入口不一…

机器学习深度学习——多层感知机

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——感知机 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 上一节…

Java阶段五Day14

Java阶段五Day14 文章目录 Java阶段五Day14分布式事务整合demo案例中架构,代码关系发送半消息本地事务完成检查补偿购物车消费 鲁班周边环境调整前端启动介绍启动前端 直接启动的项目gateway(网关)login(登录注册)atta…

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

数据库表结构导出成文档

1.需求说明 在系统交付的过程中,有时候需要交付数据库的表结构,如果系统做的比较大,比如几百张表的时候,靠人力一张表一张的写,那就是一个奔溃啊。所以今天特意找了一下工具,小巧安装。比较好用。 2.安装…

新型恶意软件DecoyDog正大规模入侵DNS

安全厂商 Infoblox 的调查研究显示,一个名为 DecoyDog(诱饵狗)的复杂恶意工具包通过域名系统(DNS),从事网络间谍活动已达1年以上。 目前尚不清楚该恶意软件的幕后黑手是谁,但 Infoblox 的研究人…

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接:Components API 二、上传API接口说明 在Nexus中可以直接调试api接口,url参考:http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中,如何提高客户留存率和忠诚度,已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式,受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

2023扩散模型最新技术进展汇总

随着Stable Diffusion和Midjourney等图像生成模型的爆火,今年在模型领域,扩散模型稳占主导地位。因此,与之相关的新技术也层出不穷,短短1个月,扩散模型相关的论文就有上百篇了,可见其发展的火热趋势。 这次…

java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?

一、注解EnableFeignClients 修饰在spring boot入口类&#xff0c;使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…

额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过 class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> result(nums.size(), 0);for (int i0; i<nums.size(); i) {int count 0;for (int j0; j<nums.size(); j) {if (nums[j]<…

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…