嵌入式学习-线性表-Day04-队列

news2024/11/28 7:26:47

嵌入式学习-线性表-Day04-队列

队列

循环队列(顺序队列)

1)创建一个空的队列

2)入列

3)求长度

链式队列

(1)创建一个空的队列

(2)入列

(3)出列

队列

1 什么是队列?

只允许在两端进行插入和删除操作的线性表,在队尾插入,在队头删除 插入的一端,被称为"队尾",删除的一端被称为"队头"

在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。

2 队列的特点

先进先出 FIFO first in first out

后进后出 LILO last

循环队列顺序队列)

1逻辑结构线性结构

2存储结构顺序存储

3操作入队出队

#define N 5

typedef int datatype;

typedef struct

{

datatype data[N];

int rear; //后面,队尾

int front; //前面,队头

}sequeue_t;//sequence 顺序 queue队列

1)创建一个空的队列

2)入列

3)求长度

sequeue.c

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef int datatype;
typedef struct
{
    datatype data[N]; // 循环队列的数组
    int rear;         // 存数据端 rear 后面
    int front;        // 取数据端 front 前面
} sequeue_t;
// 1.创建一个空的队列
sequeue_t *CreateEmptySequeue()
{
    // 1.开辟一个结构体大小的空间
    sequeue_t *p = (sequeue_t *)malloc(sizeof(sequeue_t));
    if (p == NULL)
    {
        perror("CreateEmptySequeue err");
        return NULL;
    }
    // 2.初始化
    p->front = 0;
    p->rear = 0;
    return p;
}
// 3.判断队列是否为满
int IsFullSequeue(sequeue_t *p)
{
    // 判断尾巴的下一个位置是不是头
    return (p->rear + 1) % N == p->front;
}
// 2.入列 data代表入列的数据
int InSequeue(sequeue_t *p, datatype data)
{
    // 1.判满
    if (IsFullSequeue(p))
    {
        perror("IsFullSequeue");
        return -1;
    }
    // 2.数据入队
    p->data[p->rear] = data;
    // 3.移动尾下标
    p->rear = (p->rear + 1) % N;
    return 0;
}
// 4.判断队列是否为空
int IsEmptySequeue(sequeue_t *p)
{
    return p->rear == p->front;
}
// 5.出列
datatype OutSequeue(sequeue_t *p)
{
    // 1.判空
    if (IsEmptySequeue(p))
    {
        perror("IsEmptySequeue");
        return -1;
    }
    // 2.取数据
    datatype temp = p->data[p->front];
    // 3.移动队头
    p->front = (p->front + 1) % N;
    return temp;
}
// 6.求队列的长度
int LengthSequeue(sequeue_t *p)
{
    // if(p->rear >= p->front)
    //     return p->rear - p->front;
    // else
    //     return p->rear - p->front + N;

    return (p->rear - p->front + N)%N;
}
// 7.清空队列函数
void ClearSequeue(sequeue_t *p)
{
    p->front = p->rear;
}
int main(int argc, char const *argv[])
{
    sequeue_t * p = CreateEmptySequeue();
    for(int i=1;i<5;i++)
        InSequeue(p,i);
        printf("len is %d\n",LengthSequeue(p));
    while (!IsEmptySequeue(p))
        printf("%d  ",OutSequeue(p));
    printf("\n");
    free(p);
    p=NULL;
    
    return 0;
}


链式队列

1逻辑结构线性结构

  1. 存储结构链式存储
  2. 操作入队出队

typedef int datatype;

typedef struct node

{

datatype data;//数据域

struct node *next;//指针域

}linkqueue_node_t,*linkqueue_list_t;

typedef struct//将队列头指针和尾指针封装到一个结构体里

{

linkqueue_list_t front;//相当于队列的头指针

linkqueue_list_t rear;//相当于队列的尾指针

//有了链表的头指针和尾指针,那么我们就可以操作这个链表

}linkqueue_t;

(1)创建一个空的队列

(2)入列

 

(3)出列

 

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
    datatype data;     // 数据域
    struct node *next; // 指针域
} linkqueue_node_t, *linkqueue_list_t;

// linkqueue_list_t p === linkqueue_node_t *
typedef struct // 将队列头指针和尾指针封装到一个结构体里
{
    linkqueue_list_t front; // 相当于队列的头指针
    linkqueue_list_t rear;  // 相当于队列的尾指针
    // 有了链表的头指针和尾指针,那么我们就可以操作这个链表
} linkqueue_t;
// 1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue()
{
    // 1.开辟存放头尾指针的结构体的空间
    linkqueue_t *p = (linkqueue_t *)malloc(sizeof(linkqueue_t));
    if (p == NULL)
    {
        perror("CreateEmptyLinkQueue err");
        return NULL;
    }
    // 2.初始化:头尾指针都指向头节点
    p->front = p->rear = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));
    if (p->front == NULL)
    {
        perror("p->front malloc err");
        return NULL;
    }
    p->front->next = NULL; // 头节点的指针域为NULL,表示空
    return p;
}
// 2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p, datatype data)
{
    // 1.开辟一个节点大小的空间存放数据
    linkqueue_list_t pnew = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));
    if (pnew == NULL)
    {
        perror("pnew malloc err");
        return -1;
    }
    pnew->data = data;
    pnew->next = NULL;
    // 2.将节点入队(尾插)
    p->rear->next = pnew;// 新节点链接到链表的尾
    // 3.移动队尾
    p->rear = pnew;// rear移动,始终指向当前链表的尾巴
    return 0;
}
// 4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p)
{
    return p->front == p->rear;
}
// 3.出列
datatype OutLinkQueue(linkqueue_t *p)
{
    //1.判空
    if(IsEmptyLinkQueue(p))
    {
        perror("IsEmptyLinkQueue");
        return -1;
    }
    //2.定义pdel指向被删除节点(头节点)
    linkqueue_list_t pdel = p->front;
    //3.移动头指针
    p->front = pdel->next;
    //4.释放头节点
    free(pdel);
    pdel=NULL;
    //5.出队数据
    return p->front->data;
}

// 5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p);
// 6.清空队列
void ClearLinkQueue(linkqueue_t *p);

int main(int argc, char const *argv[])
{
    linkqueue_t *p=CreateEmptyLinkQueue();
    for(int i=1;i<=5;i++)
        InLinkQueue(p,i);
    for(int i=1;i<=5;i++)
        printf("%d ",OutLinkQueue(p));
    printf("\n");
    free(p->front);
    p->front =NULL;
    free(p);
    p=NULL;
    return 0;
}

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

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

相关文章

深度学习——线性神经网络(二、线性回归的从零开始实现)

目录 2.1 生成数据集2.2 读取数据集2.3 初始化模型参数2.4 定义模型2.5 定义损失函数2.6 定义优化算法2.7 训练 2.1 生成数据集 为简单展示&#xff0c;将根据带有噪声的线性模型构造一个数据集。生成一个包含1000个样本的数据集。每个样本包含从标准正态分布中的抽样的两个特征…

RocketMq-秒杀应用场景

1、介绍mq 2、秒杀介绍 -----redis配置 3、生产者-消费者搭建 1、介绍mq 消息存储架构图中主要有下面三个跟消息存储相关的文件构成。 (1) CommitLog&#xff1a;消息主体以及元数据的存储主体&#xff0c;存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大…

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…

价值5000元完整版GOD引擎手机客户端三端引擎源码 编译完整版

5000元完整版GOD引擎手机客户端三端引擎源码 支持三端互通&#xff1a;电脑端&#xff0c;安卓端&#xff0c;苹果端 GOD引擎全套源码及手游客户端源码&#xff08;苍穹引擎源码及修改教程&#xff09; 服务端代码为Delphir&#xff0c;手游客户端代码为cocos2dx的&#xff08;…

DAMA数据管理知识体系(第14章 大数据和数据科学)

课本内容 14.1 引言 概要 从数据中探究、研发预测模型、机器学习模型、规范性模型和分析方法并将研发结果进行部署供相关方分析的人&#xff0c;被称为数据科学家业务驱动 期望抓住从多种流程生成的数据集中发现的商机&#xff0c;是提升一个组织大数据和数据科学能力的最大业务…

论文阅读(十二):Attention is All You Need

文章目录 一、循环神经网络1.1RNN模型1.1.1RNN模型简介1.1.2RNN基本结构1.1.3权重共享机制1.1.4RNN局限性&#xff1a;长期依赖问题与梯度消失 1.2LSTM模型1.2.1LSTM核心思想1.2.2遗忘门1.2.3输入门1.2.4更新细胞状态1.2.5输出门1.2.6参数更新 二、Seq2Seq机制2.1RNN结构的局限…

react 知识点汇总(非常全面)

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发并维护。它的核心理念是“组件化”&#xff0c;即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX&#xff08;JavaScript XML&#xff09;。JSX 是一种 JavaScript 语法扩展&#xff0c;…

house_of_muney

house_of_muney 首先介绍一下house of muney 这个利用原理&#xff1a; 在了解过_dl_runtime_resolve的前提下&#xff0c;当程序保护开了延迟绑定的时候&#xff0c;程序第一次调用相关函数的时候会执行下面的命令 push n push ModuleID jmp _dl_runtime_resolve 这里的n…

OCR+PDF解析配套前端工具开源详解!

目录 一、项目简介 TextIn为相关领域的前端开发提供了优秀的范本。 目前项目已在Github上开源&#xff01; 二、性能特色 三、安装使用 安装依赖启动项目脚本命令项目结构 四、效果展示 面对日常生活和工作中常见的OCR识别、PDF解析、翻译、校对等场景&#xff0c;配套的…

洛谷P5648

洛谷P5648 这题花了很长时间&#xff0c;是在线段树题单里找到的&#xff08; &#xff09;。有线段树做法&#xff0c;但是我感觉可能比倍增做法更难看懂。以后有空再看看吧。感觉线段树现在只会板子题&#xff0c;绿稍微难点可能就不会。 花了很久时间之后&#xff0c;就觉得…

打造直播美颜平台的关键技术:视频美颜SDK的深度解析

本篇文章&#xff0c;小编将深入解析视频美颜SDK的关键技术&#xff0c;探讨其在打造直播美颜平台中的作用。 一、视频美颜SDK的定义与功能 视频美颜SDK是一套专门为实时视频处理而设计的软件开发工具包。其主要功能包括人脸检测、肤色美化、瑕疵修复、虚化背景、实时滤镜等。…

Python对PDF文件的合并操作

在处理 PDF 文件时&#xff0c;合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能&#xff0c;其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口&#xff0c;包括 merge() 方法&#xff0c;可…

CRE6281B1 (宽VCC:8-45V PWM电源芯片)

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;采用节能模式&#xff0c;实现较高的功率转换效…

关于Allegro导出Gerber时的槽孔问题

注意点一&#xff1a; 如果设计的板子中有 槽孔和通孔(俗称圆孔)&#xff0c;不仅要NC Drill, 还要 NC Route allegro导出的槽孔文件后缀是 .rou 圆型孔后缀 是 .drl &#xff0c;出gerber时需要看下是否有该文件。 注意点二&#xff1a; 导出钻孔文件时&#xff0c;设置参…

Hi3061M开发板——系统时钟频率

这里写目录标题 前言MCU时钟介绍PLLCRG_ConfigPLL时钟配置另附完整系统时钟结构图 前言 Hi3061M使用过程中&#xff0c;AD和APT输出&#xff0c;都需要考虑到时钟频率&#xff0c;特别是APT&#xff0c;关系到PWM的输出频率。于是就研究了下相关的时钟。 MCU时钟介绍 MCU共有…

22.1 K8S之KubeSphere实现中间件高可用集群

22.1 K8S之KubeSphere实现中间件高可用集群 一. 章节概述二. WordPress1. WordPress 简介---------------------------------------------------------------------------------------------------一. 章节概述 二. WordPress 1. WordPress 简介 创建并部署 WordPress

MySQL 数据库的性能优化方法方法有哪些?

MySQL 数据库的性能优化方法方法有哪些&#xff1f; 从开发角度来看&#xff0c;一般可以从 SQL 和库表设计两部分优化性能。 SQL 优化 根据慢sql日志&#xff0c;找出需要优化的一些sql语句。 常见优化方向&#xff1a; 避免select *&#xff0c;只查询必要的字段&#x…

62 加密算法

62 加密算法 三种加密算法分类&#xff1a; 对称加密&#xff1a;密钥只有一个&#xff0c;解密、解密都是这个密码&#xff0c;加解密速度快&#xff0c;典型的对称加密有DES、AES、RC4等非对称加密&#xff1a;密钥成对出现&#xff0c;分别为公钥和私钥&#xff0c;从公钥…

sass学习笔记(1.0)

1.使用变量 sass可以像声明变量那样进行使用&#xff0c;这样同样的样式&#xff0c;就可以使用相同的变量来提高复用。 语法为&#xff1a;$ 变量名 在界面中也可以正常的显示 当然了&#xff0c;变量之间也可以相互引用&#xff0c;比如下面 div{$_color: #d45387;$BgColo…

kibana 删除es指定数据,不是删除索引

1 查询条件查询出满足条件的数据 GET /order_header_idx_202410/_search {"from":0,"size":10,"query":{"bool":{"filter":[{"term":{"oh_tenantId":{"value":"0211000001",&…