(40)4.30数据结构(队列)

1.队列的基本概念

2.队列的顺序

#define MaxSize 10
#define ElemType int
typedef struct 
{
    ElemType data[MaxSize];
    int front, rear;
}SqQueue;
//1.初始化操作
void InitQueue(SqQueue& Q)
{
    //初始化 队头,队尾指针指向0
    Q.rear = Q.front = 0;
  }
//判断为空
bool QueueEmpty(SqQueue Q)
{
    if (Q.rear = Q.front)  //队空条件
        return true;
    else
        return false;
}
void testQueue()
{
    SqQueue Q;
    InitQueue(Q);
    //..后续操作。。//
}
//2.入队
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;//队尾指针加1取模
    return true;
}
//3.出队(删除一个队头元素,并用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 DEQueue(SqQueue& Q, ElemType& x)
{
    if (Q.rear == Q.front)
        return false;   //队空则报错
    x = Q.data[Q.front];
    return true;
}

//队列元素个数:
//(rear+MaxSize-front)%MaxSize
//方案二判断队列已满/已空
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;
    int size;  //初始化时  rear=front=0; size=0;
}SqQueue;
//插入成功size++
//插入失败size--
//方案三判断队列已满/已空
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;
    int tag;//最近进行的是删除/插入
}SqQueue;
//每次删除操作成功时,都令tag=0;
//每次删除操作失败时,都令tag=1;
//只有删除成功才能导致队空;
//只有插入成功才能导致队满;

//队满条件:
//front==rear&&tag==1;
//队空条件
//front==rear&&tag==0;

//其他出题方法
//指向尾指针元素指向的方向

4.在做题的时候要注意rear指针指向的位置

知识点小结


3.队列的链式实现

#include <stdio.h>
#include <stdlib.h>

#define ElemType int

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

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

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

void testLinkQueue()
{
    LinkQueue Q;  //声明一个队列
    InitQueue(Q); //初始化队列
    //。。。后续操作/
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
    if (Q.rear = Q.front)  //队空条件
        return true;
    else
        return false;
}
//初始化队列(不带头结点)
void InitQueue(LinkQueue& Q)
{
    //初始化 front rear 都指向NULL
    Q.rear = NULL;
    Q.front= NULL;
}
bool IsEmpty(LinkQueue Q)
{
    if (Q.front ==NULL) 
        return true;
    else
        return false;
}
//2.入队(带头结点)
void EnQueue(LinkQueue& Q, ElemType x)
{
    LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    Q.rear->next = s;
    Q.rear = s;
}
//入队(不带头结点)
void EnQueue(LinkQueue& Q, ElemType x)
{
    LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    if (Q.front == NULL)//在空队列中插入第一个元素
    {
        Q.front = s;      //修改队头尾指针
        Q.rear = s;
    }
    else
    {
        Q.rear->next = s; //新节点插入到rear 结点之后
        Q.rear = s;    //修改rear 指针 
    }
}
//出队(带头结点)

bool DeQueue(LinkQueue& Q, ElemType& x)
{
    if (Q.front == Q.rear)
        return false;            //空队
    LinkNode* p = Q.front->next; 
    x = p->data;                //用变量x返回队头元素
    Q.front->next = p->next;    //修改头结点的next指针
    if (Q.rear == p)            //此次是最后一个结点出队
        Q.rear = Q.front;       //修改rear指针
    free(p);                    //释放空间 
    return true;
}
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue& Q, ElemType& x)
{
    if (Q.front == NULL)
        return false;            //空队
    LinkNode* p = Q.front;      //p指向此次出队的结点
    x = p->data;                //用变量x返回队头元素
    Q.front = p->next;          //修改头结点的front指针
    if (Q.rear == p)            //此次是最后一个结点出队
    {
        Q.rear = NULL;          //front 指向 NULL
        Q.rear = NULL;          //rear 指向NULL 
    }
    free(p);                    //释放空间 
    return true;
}

知识点小结

4.双端队列

输入受限的双端队列

输出受限的双端队列

双端队列

(主要考出对入队的模拟操作)

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

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

相关文章

环形链表理解||QJ141.环形链表

在链表中&#xff0c;不光只有普通的单链表。之前写过的的一个约瑟夫环形链表是尾直接连向头的。这里的环形链表是从尾节点的next指针连向这链表的任意位置。 那么给定一个链表&#xff0c;判断这个链表是否带环。qj题141.环形链表就是一个这样的题目。 这里的思路是用快慢指…

B3966 [语言月赛 202404] 道法考试

题目背景 你正在参加一场道法考试。这次的道法考试题目全部都是问答题。 题目描述 有 n 道题目&#xff0c;每道题标准答案都是 m 个整数&#xff0c;代表答案包含的知识点的编号。 而你对于第 i&#xff08;1≤i≤n&#xff09;道题的作答是 li​ 个整数&#xff0c;代表作…

jenkins+gitlab+ansible-tower实现发布

前提准备&#xff1a; gitlab中上传相应的jenkinsfile文件和源码。 安装和破解ansible-tower。 安装jenkins。 大致流程&#xff1a;从gitlab中拉取文件&#xff0c;存放到windows机器上&#xff0c;使用nuget等进行打包到windows中&#xff0c;使用sshPublisher语句传输到远程…

使用QRegularExpression从样式表中提取颜色

QRegularExpression 类是 Qt 框架中用于处理正则表达式的类。 首先定义一个函数&#xff08;很多代码都来自chat gtp的生成&#xff0c;不得不说确实很棒&#xff09; from PySide6.QtCore import QRegularExpressiondef find_text_between_strings(text, start_str, end_st…

LLMs之RAG:LangChain-Chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 FastChat 接入的ChatGLM-2/LLaMA-2等多款主流LLMs+多款embe

LLMs之RAG&#xff1a;LangChain-Chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 FastChat 接入的ChatGLM-2/LLaMA-2等多款主流LLMs多款embedding模型m3e等多种TextSplitter分词器)、安装(镜像部署【AutoDL云平台/Docker镜像】&#xff0c;离线私有部署支持RTX3…

yum仓库及NFS共享

yum简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 yum 实现过程 先在yum服务器上创建 yum repository&#xff08;仓库&#xff09;&#xff0c;在仓…

stm32f103zet6_DAC_2_输出电压

实现效果 DAC输出的电压 同过电压表测量电压 1.DAC配置的步骤 初始化DAC时钟。配置DAC的GPIO端口。设置DAC的工作模式&#xff08;例如&#xff0c;是否使用触发功能&#xff0c;是否启用DAC中断等&#xff09;。启动DAC。 2常用的函数 函数 HAL_DAC_Start() - 开启指定…

EtherCAT开发_4_分布时钟知识点摘抄笔记1

分布时钟 (DC&#xff0c;Distributed Cl ock) 可以使所有EtherCAT设备使用相同的系统时间&#xff0c;从而控制各设备任务的同步执行。从站设备可以根据同步的系统时间产生同步信号&#xff0c;用于中断控制或触发数字量输入输出。支持分布式时钟的从站称为 DC 从站。分布时钟…

ATA-2161高压放大器用途有哪些种类

高压放大器是一种电子设备&#xff0c;其主要功能是将输入信号放大到较高的电压水平&#xff0c;同时保持信号的形状和特性。这种设备在各种应用领域中都有重要作用&#xff0c;它的种类繁多&#xff0c;根据不同的用途可以分为多种类型。 1.医学领域 在医学设备中&#xff0c;…

Sermant在异地多活场景下的实践

Sermant社区在1.3.0和1.4.0版本相继推出了消息队列禁止消费插件和数据库禁写插件&#xff0c;分别用于解决异地多活场景下的故障切流和保护数据一致性问题。本文将对Sermant在异地多活场景下的实践进行剖析。 一、异地多活 1.1 什么是异地多活 对于一个软件系统&#xff0c;…

极致视觉盛宴,尽在Extreme Picture Finder!

在信息爆炸的时代&#xff0c;网络图片如同繁星点点&#xff0c;为我们的生活增添无尽的色彩。然而&#xff0c;如何在浩渺的网海中快速、准确地找到心仪的图片&#xff0c;却成了许多人的难题。此刻&#xff0c;Extreme Picture Finder如同一位贴心的向导&#xff0c;引领我们…

idea修改maven项目名称及子模块名称

一、修改目录名称 shift F6修改目录&#xff0c;选择“rename module and dictionary”。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/43efd9c6af6e43ad9656455db94b37a2.png)二、修改子项目pom的 三、修改父项目pom的 四、刷新maven项目

深度解读《深度探索C++对象模型》之C++的临时对象(一)

目录 暂存函数返回结果的临时对象 表达式运算过程产生的临时对象 接下来我将持续更新“深度解读《深度探索C对象模型》”系列&#xff0c;敬请期待&#xff0c;欢迎关注&#xff01;也可以关注公众号&#xff1a;iShare爱分享&#xff0c;或文章末尾扫描二维码&#xff0c;自…

TypeScript常见面试题第六节

题目二十六:TypeScript 中的装饰器? 一、讲解视频 TS面试题二十六:TypeScript 中的可选链? 二、题目解析 本题目考察可选链的相关知识,可选链是比较新的一个语法,是一种访问嵌套对象属性的安全的方式。即使中间的属性不存在,也不会出现错误。如果可选链 ?. 前面的值为…

effective python学习笔记_pythonic思维

查py版本 import sys sys.version sys.version_info 遵循PEP8 PEP8,Python Enhancement Proposal #8 章节列了几个点&#xff0c;也可以看原文PEP 8 – Style Guide for Python Code | peps.python.org 导包顺序建议&#xff1a;先导标准库模块&#xff0c;再导三方模块&…

论文查重率高,有什么办法降重吗?推荐笔灵AI

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

LMdeploy推理实践

在inter-studio平台上&#xff0c;下载模型&#xff0c;体验lmdeploy 下载模型 这里是因为平台上已经有了internlm2模型&#xff0c;所以建立一个符号链接指向它&#xff0c;没有重新下载 ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/如…

算法提高之炮兵阵地

算法提高之炮兵阵地 核心思想&#xff1a;状态压缩dp 滚动数组优化 考虑前两层状态 用f[i,j,k]表示前i层&#xff0c;第i层状态j&#xff0c;第i-1层状态k的方案同“玉米田” g存图1是不能放的位置**滚动数组优化&#xff1a;**所有第一维n或者n1 &1 #include <iost…

论文查重率高,有什么办法降重吗?推荐几个ai降重工具

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

YOLOv8检测图片和视频

一、检测图片 Python import cv2 from ultralytics import YOLO import torchmodel_path object_detection/best.pt # Change this to your YOLOv8 models path image_path object_detection/32.jpg # Change this to your videos path# Load the trained YOLOv8 model m…