数据结构之《队列》
在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈,在本篇中我们将继续学习另一种线性表的结构——队列,在通过本篇的学习后,你将会对栈的结构有充足的了解,在了解完结构后我们还将进行栈的实现。一起加油吧!!!
1.队列的结构与定义
概念:只允许在一端进行插入数据操作,在另⼀端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
那么在队列的底层结构应该选择的是数组还是链表呢?接下来就来分析看看
在使用数组作为队列的底层结构时,由于队列的性质要求先进先出,所以可以使用size来表示数组内的有效元素个数,这样在入队列时就可以直接在数组的size位置插入数据,但是在出队列时为了将数组内的首个元素也就是数组下标为0的位置移除,这就需要将数组从下标为1的位置开始整体都向前移动一位,所以在出队列的时间复杂度为O(N)
在使用单链表作为队列的底层结构时,由于队列的性质要求先进先出,所以如果只用一个phead指针指向链表的第一个节点,那么就会使得在入队列时要找到链表的尾节点就需要通过遍历链表才能实现,这就会使得时间复杂度为O(N),所以为了解决以上这种缺陷,就在创建一个指针指向链表的尾节点,在入队列是就可以直接找到尾节点,这样就可以使得无论是入队列还是出队列时间复杂度都为O(1)
通过以上的分析就可以得出在实现队列时底层结构选择单链表是最优解
2.队列的实现
在实现队列的代码中,在Queue.h头文件中定义队列的结构以及队列中各个函数的声明,在Queue.c文件内完成各个函数的定义,在test.c文件内对实现的各个函数进行测试
2.1队列结构的定义
在队列结构的定义中,创建一个结构体QueueNode来表示节点,该节点内部有两个成员变量,data来存放节点的数据,next指针来存放下一个节点的地址;之后还需再创建一个结构体Queue来存放指向链表的第一个节点和尾节点的指针,并且在这个结构体内还创建一个成员变量size来表示链表中节点的个数,这样是为了在之后的计算队列有效数据个数时直接将size的值提取出来就可实现了
//队列结构的定义
typedef int QDataType;
typedef struct QueueNode
{QDataType data;//节点内的数据struct QueueNode* next;//指向下一个节点的指针}QueueNode;typedef struct Queue
{struct QueueNode* phead;//指向第一个节点的指针struct QueueNode* ptail;//指向尾节点的指针int size;//节点的个数}Queue;
2.2队列的初始化
要完成队列的初始化函数首先要在Queue.h内完成函数的声明
//初始化队列
void QueueInit(Queue* pq);
将该函数命名为QueueInit,函数的参数为存放指向头尾节点指针的结构体指针
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
2.2判断队列是否为空
要完成队列判空函数首先要在Queue.h内完成函数的声明
bool QueueEmpty(Queue* pq);
将该函数命名为QueueEmpty,函数的为存放指向头尾节点指针的结构体指针,函数的放回类型是布尔类型,当队列为空时放回true,不为空就放回false
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
在队列为空时就是指向第一个队列的指针phead和指向队列的尾部的指针ptail都为空,所以该函数的返回值就为pq->phead ==NULL && pq->ptail == NULL
//队列判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead ==NULL && pq->ptail == NULL;
}
2.3入队列
要完成入队列函数首先要在Queue.h内完成函数的声明
//入队列
void QueuePush(Queue* pq, QDataType x);
将该函数命名为QueuePush,函数的参数有两个,第一个为存放指向头尾节点指针的结构体指针,第二个为要插入的数据
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
在实现数据的入队列前要为数据申请新的节点空间,在此使用malloc来实现,申请完之后在将要入队列的数据x存放到新节点newnode中,之后在将新节点插入到链表时要分以下两种情况,一种是phead指针指向为空时也就是这时链表内一个节点都没有,这时就要将phead和ptail都newnode;另外一种情况是phead指针指向不为空时,这时就先使得ptail的next指针指向newnode,之后再将ptail指向新节点newnode
最后在完成以上操作后要将有效个数size+1
//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead== NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
2.4出队列
要完成出队列函数首先要在Queue.h内完成函数的声明
//出队列
void QueuePop(Queue* pq);
将该函数命名为QueuePop,函数的参数为存放指向头尾节点指针的结构体指针
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
同时在出队列时队列内不能一个节点都没有,所以要判断队列内不为空,因此要将!QueueEmpty进行assert断言之后在出队列也就是删除单链表的第一个节点时分为以下两种情况,第一种是指针phead和指针ptail指向同一个节点也就是链表中只有一个节点,这时就直接释放该节点,之后再将phead和ptail置为空;另外一种情况是指针phead和指针ptail不相同,这时就先创建一个新的指针变量Next指向原来的phead的next指针指向的节点,之后将phead指向的节点释放后,在将phead指针置为Next指向的节点
最后在完成以上操作后要将有效个数size-1
//出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QueueNode* Next = pq->phead->next;free(pq->phead);pq->phead = Next;}pq->size--;}
2.5取队列头数据
要完成取队列头数据函数首先要在Queue.h内完成函数的声明
//取队列头数据
QDataType QueueFront(Queue* pq);
将该函数命名为QueueFront,函数的参数存放指向头尾节点指针的结构体指针,函数的放回值就为队列的头数据也就是单链表的第一个节点存放的数据
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
同时在出队列时队列内不能一个节点都没有,所以要判断队列内不为空,因此要将!QueueEmpty进行assert断言
在队列中的头数据就为phead指针指向的节点内存放的数据
因此该函数直接放回pq->phead->data即可
//取队列头数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}
2.6取队尾数据
要完成取队列尾数据函数首先要在Queue.h内完成函数的声明
//取队列尾数据
QDataType QueueBack(Queue* pq);
将该函数命名为QueueBack,函数的参数为存放指向头尾节点指针的结构体指针,函数的放回值就为队列的尾数据也就是单链表的最后一个节点存放的数据
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
同时在出队列时队列内不能一个节点都没有,所以要判断队列内不为空,因此要将!QueueEmpty进行assert断言
在队列中的尾数据就为ptail指针指向的节点内存放的数据
因此该函数直接放回pq->ptail->data即可
//取队列尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}
2.7队列有效数据个数
要完成队列有效数据个数函数首先要在Queue.h内完成函数的声明
//队列有效数据个数
int QueueSize(Queue* pq);
将该函数命名为QueueSize,函数的参数为存放指向头尾节点指针的结构体指针,函数的返回值就为队列内有效的数据个数
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
因为队列内的有效数据个数就为结构体Queue内的成员变量size的值
所以该函数直接放回pq->size即可
//队列有效数据个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
2.8队列的销毁
要完成队列的销毁函数首先要在Queue.h内完成函数的声明
//销毁队列
void QueueDestory(Queue* pq);
将该函数命名为QueueDestory, 函数的参数为存放指向头尾节点指针的结构体指针
完成了函数的声明接下来就是在Queue.c函数内完成函数的定义
因为以下函数中的pq指针是存放指向头尾节点指针的结构体指针,该指针不能为空,因此要将pq进行assert断言
同时在出队列时队列内不能一个节点都没有,所以要判断队列内不为空,因此要将!QueueEmpty进行assert断言在销毁过程中通过遍历的方法来用free释放链表的所有节点,最后再将指针phead和指针ptail置为空,将有效数据个数赋值为0
//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QueueNode* pcur = pq->phead;while (pcur){QueueNode* Next = pcur->next;free(pcur);pcur = Next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
3.队列实现完整代码
Queue.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//队列结构的定义
typedef int QDataType;
typedef struct QueueNode
{QDataType data;//节点内的数据struct QueueNode* next;//指向下一个节点的指针}QueueNode;typedef struct Queue
{struct QueueNode* phead;//指向第一个节点的指针struct QueueNode* ptail;//指向尾节点的指针int size;//节点的个数}Queue;
//初始化队列
void QueueInit(Queue* pq);
//销毁队列
void QueueDestory(Queue* pq);
//入队列
void QueuePush(Queue* pq, QDataType x);
//出队列
void QueuePop(Queue* pq);
//队列判空
bool QueueEmpty(Queue* pq);
//取队列头数据
QDataType QueueFront(Queue* pq);
//取队列尾数据
QDataType QueueBack(Queue* pq);
//队列有效数据个数
int QueueSize(Queue* pq);
Queue.c
#include"Queue.h"//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QueueNode* pcur = pq->phead;while (pcur){QueueNode* Next = pcur->next;free(pcur);pcur = Next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//队列判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead ==NULL && pq->ptail == NULL;
}//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead== NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QueueNode* Next = pq->phead->next;free(pq->phead);pq->phead = Next;}pq->size--;}//取队列头数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}//取队列尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;}//队列有效数据个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
相关文章:
数据结构之《队列》
在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈,在本篇中我们将继续学习另一种线性表的结构——队列,在通过本篇的学习后,你将会对栈的结构有充足的了解,在了解完结构后我们还将进行栈的实现。一起…...
【NPU 系列专栏 2 -- NVIDIA 的 H100 和 H200 是什么?】
请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 芯片NVIDIA H100 芯片简介NVIDIA H100 主要特点NVIDIA H100 应用场景NVIDIA H100 使用举例NVIDIA H200 芯片简介NVIDIA H200 主要特点NVIDIA H200 应用场景NVIDIA H200 使用举例Summary NVIDIA H100 和 H20…...
【BUG】已解决:IndexError: positional indexers are out-of-bounds
IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…...
视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案
现在视频汇聚,视频融合和视频互动,是视频技术的应用方向,目前客户一般有很多视频的业务系统,如已有GB28181的监控(GB现在是国内主流,大量开源接入和商用方案),rtsp设备,音…...
SpringCloud断路器的使用与原理解析
Spring Cloud断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。 Spring Cloud断路器的使用与原理解析如下: 一、使用断…...
结构型模式-分类
一、结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成…...
【前端】JavaScript入门及实战106-110
文章目录 106 a的索引问题107 使用DOM操作CSS108 读取元素当前的样式109 getStyle()110 其他样式操作的属性滚动条练习 106 a的索引问题 <!DOCTYPE html> <html> <head> <title></title> <meta charset"utf-8"> <script typ…...
git 版本回退-idea
1、选中项目,右键,打开 git历史提交记录 2、选中想要回退的版本,选择 hard(不保留版本记录) 3、最终选择强制提交(必须强制) OK,搞定...
[安洵杯 2019]easy_serialize_php
进入界面然后 <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); } 这就是个正则if($_SESSION){unset($_SESSION); 销毁 }$_SESSION["use…...
2024年软件测试面试题大全【含答案】
一、面试基础题 简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例(等价类划分法、边界值分析法等)。 5、用例评审(…...
返回倒数第 k 个节点 - 力扣(LeetCode)
面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k) {struct ListNode* fastnode head…...
12 前端工程化
组件化 1. 组件化理解 就是将页面的某一部分独立出来,将这一部分的数据层(M)、视图层(V)和控制层(C)用黑盒的形式全部封装到一个组件内,暴露出一些开箱即用的函数和属性供外部调用。…...
跨文档消息传递:WebKit中的Web通信新纪元
跨文档消息传递:WebKit中的Web通信新纪元 在现代Web应用中,跨文档消息传递(Cross-document messaging)是一种允许不同源的文档进行通信的机制。这种机制对于构建复杂的Web应用,如嵌入式框架(iframes&#…...
面试题 33. 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述示例 题解递归单调栈 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 示例 参考以下这颗二叉搜索树&#…...
Web响应式设计———1、Grid布局
1、网格布局 Grid布局 流动网格布局是响应式设计的基础。它通过使用百分比而不是固定像素来定义网格和元素的宽度。这样,页面上的元素可以根据屏幕宽度自动调整大小,适应不同设备和分辨率。 <!DOCTYPE html> <html lang"en"> &l…...
ESP32开发进阶: 训练神经网络
一、网络设定 我们设定一个简单的前馈神经网络,其结构如下: 输入层:节点数:2,接收输入数据,每个输入样本包含2个特征,例如 {1.0, 0.0}, {0.0, 1.0} 等。 隐藏层:节点数:…...
全国区块链职业技能大赛国赛考题前端功能开发
任务3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下: 具体要求如下: (1)有明确的提示,提示用户选择角色; (2)用户可看…...
直接插入排序算法详解
直接插入排序(Straight Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排…...
sql手动自增id
有时候在运维处理数据的时候,需要给某张表插入新的记录,那么需要知道最新插入数据的id,并在最新id的基础上加上id增长步长获取新的id,这个过程往往需要现将max出来加1,再手动补充到sql语句中,很麻烦,而且数据多的时候容易出错。有…...
10_TypeScript中的泛型
TypeScript中的泛型) 一、泛型的定义二、泛型函数三、泛型类:比如有个最小堆算法,需要同时支持返回数字和字符串两种类型。通过类的泛型来实现四、泛型接口五、泛型类 --扩展 把类作为参数类型的泛型类1、实现:定义一个 User 的类…...
Unity3D之TextMeshPro使用
文章目录 1. TextMeshPro简介2. TextMeshPro创建3. TextMeshPro脚本中调用4. TextMeshPro字体设置及中文支持过程中出现的一些问题 1. TextMeshPro简介 【官网文档】https://docs.unity.cn/cn/2020.3/Manual/com.unity.textmeshpro.html TextMeshPro 是 Unity 的最终文本解决…...
K8S 上部署 Prometheus + Grafana
文章目录 一、使用 Helm 安装 Prometheus1. 配置源2. 下载 prometheus 包3. 安装 prometheus4. 卸载 二、使用 Helm 安装 Grafana1. 配置源2. 安装 grafana3. 访问4. 卸载 一、使用 Helm 安装 Prometheus 1. 配置源 地址:https://artifacthub.io/packages/helm/pro…...
雷军的逆天改命与顺势而为
雷军年度演讲前,朋友李翔提了一个问题:雷军造车是属于顺势而为还是逆势而为?评论互动区有一个总结,很有意思,叫“顺势逆袭”。 大致意思是产业趋势下小米从手机到IOT再切入汽车,是战略的必然,不…...
Leetcode 11. 盛最多水的容器
Leetcode 11. 盛最多水的容器 Leetcode 11. 盛最多水的容器 一、题目描述二、我的想法 一、题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成…...
Java笔试分享
1、设计模式(写>3种常用的设计模式) 设计模式是在软件工程中解决常见问题的经验性解决方案。以下是一些常用的设计模式: 单例模式(Singleton): 意图:确保一个类只有一个实例,并…...
LeetCode:对称的二叉树(C语言)
1、问题概述:给一个二叉树,看是否按轴对称 2、示例 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 3、分析 (1&a…...
Postman中的API Schema验证:确保响应精准无误
Postman中的API Schema验证:确保响应精准无误 在API开发和测试过程中,验证响应数据的准确性和一致性是至关重要的。Postman提供了一个强大的功能——API Schema验证,它允许开发者根据预定义的JSON Schema来检查API响应。本文将详细介绍如何在…...
深入浅出WebRTC—GCC
GoogCcNetworkController 是 GCC 的控制中心,它由 RtpTransportControllerSend 通过定时器和 TransportFeedback 来驱动。GoogCcNetworkController 不断更新内部各个组件的状态,并协调组件之间相互配合,向外输出目标码率等重要参数࿰…...
leetcode日记(49)旋转链表
其实不难,就是根据kk%len判断需要旋转的位置,再将后半段接在前半段前面就行。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : …...
InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置
第一步:下载ideaIC-2024.1.4 方法1:在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2:百度网盘 链接:https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…...
【23】Android高级知识之Window(四) - ThreadedRenderer
一、概述 在上一篇文章中已经讲了setView整个流程中,最开始的addToDisplay和WMS跨进程通信的整个过程做了什么。继文章Android基础知识之Window(二),这算是另外一个分支了,接着讲分析在performTraversals的三个操作中,最后触发pe…...
Java-根据前缀-日期-数字-生成流水号(不重复)
🎈边走、边悟🎈迟早会好 小伙伴们在日常开发时可能会遇到的业务-生成流水号,在企业中可以说是比较常见的需求, 可以采用"前缀日期数字"的方式(ps:此方式是需要用到缓存的)前缀:为了…...
跟李沐学AI:卷积层
从全连接层到卷积 多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。但对于图片等数据,全连接层会导致参数过多。卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一…...
使用RedisTemplate操作executePipelined
前言 RedisTemplate 是 Spring 提供的用于操作 Redis 的模板类,它封装了 Redis 的连接、连接池等管理,并提供了一系列的操作方法来简化 Redis 的使用。其中,executePipelined 方法是 RedisTemplate 中的一个高级特性,用于支持 Re…...
react-native从入门到实战系列教程一环境安装篇
充分阅读官网的环境配置指南,严格按照他的指导作业,不然你一直只能在web或沙箱环境下玩玩 极快的网络和科学上网,必备其中的一个较好的心理忍受能力,因为上面一点就可以让你放弃坚持不懈,努力尝试 成功效果 三大件 …...
【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)
【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…...
国科大作业考试资料-人工智能原理与算法-2024新编-第十二次作业整理
袋子里面有3个有偏差的硬币a、b和c,抛掷硬币正面朝上的概率分别是20%、60%和80%。从袋子里随机取出一个硬币(3个硬币被取出的概率是相等的),并把取出的硬币抛掷3次,得到抛掷结果依次是X1 , X2和 X3。 a. 画出对应的贝叶斯网络并定义必要的CPT表。 b. 如果抛掷结果是2次正…...
《0基础》学习Python——第二十一讲__网络爬虫/<4>爬取豆瓣电影电影信息
爬取网页数据(获取网页信息全过程) 1、爬取豆瓣电影的电影名称、导演、主演、年份、国家、评价 2、首先我们先爬取页面然后再获取信息 1、爬取网页源码 import requests from lxml import etree if __name__ __main__:#UA伪装head{User-Agent:Mozilla/…...
【C++初阶】string类
【C初阶】string类 🥕个人主页:开敲🍉 🔥所属专栏:C🥭 🌼文章目录🌼 1. 为什么学习string类? 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…...
RAS--APEI 报错解析流程(2)
RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误,在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot,it is reported as a ‘one-time polle…...
微软蓝屏事件对企业数字化转型有什么影响?
引言:从北京时间2024年7月19日(周五)下午2点多开始,全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后,网络安全公司CrowdStrike称,收到大量关于Windows电脑出现蓝屏报告,公司…...
【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)
【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…...
浅谈Devops
1.什么是Devops DevopsDev(Development)Ops(Operation) DevOps(Development和Operations的混合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”…...
大文件分片上传(前端TS实现)
大文件分片上传 内容 一般情况下,前端上传文件就是new FormData,然后把文件 append 进去,然后post发送给后端就完事了,但是文件越大,上传的文件也就越长,如果在上传过程中,突然网络故障,又或者…...
unity2D游戏开发02添加组件移动玩家
添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器,不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject,属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…...
设计模式 之 —— 单例模式
目录 什么是单例模式? 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式:线程不安全 2.懒汉式:线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点: 缺点: 适用场景: 什么是单例模…...
深入浅出WebRTC—ULPFEC
FEC 通过在发送端添加额外的冗余信息,使接收端即使在部分数据包丢失的情况下也能恢复原始数据,从而减轻网络丢包的影响。在 WebRTC 中,FEC 主要有两种实现方式:ULPFEC 和 FlexFEC,FlexFEC 是 ULPFEC 的扩展和升级&…...
Python从0到100(四十三):数据库与Django ORM 精讲
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
Redis-主从模式
目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制(Full Sync Replication) 局部复制(Partial Replication) Redis的学习专栏:http://t.csdnimg.cn/a8cvV 前言 …...
加速决策过程:企业级爬虫平台的实时数据分析
摘要 在当今数据驱动的商业环境中,企业如何才能在海量信息中迅速做出精准决策?本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程,实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业,提升数据处理效率,…...