新开传奇网站发布网单/站长工具使用方法
大家好,我是小卡皮巴拉
文章目录
目录
引言
一.队列的基本概念
1.1 队列的定义
1.2 队列的特性
1.3 队列的基本操作
二.队列的实现方式
2.1 基于链表的队列
2.2 基于数组的队列
三.基于链表的队列实现
定义链表队列的结构
初始化
入队列——向队列中插入数据
队列判空
队列有效元素个数
出队列——从队列中删除数据
取队头数据
取队尾数据
销毁队列
兄弟们共勉!!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
引言
想象一下你在超市排队结账,每个人都按顺序等待,先到的先结账。这种排队的方式,其实就是数据结构中的“队列”。队列,简单来说,就是数据按照到达的顺序排队,先到的先处理。
在编程中,队列帮助我们管理一系列的任务或数据,确保它们按照正确的顺序被执行或处理。无论是处理用户请求、管理打印任务,还是在算法中进行搜索,队列都发挥着重要的作用。
现在,让我们一起探索这个简单而强大的数据结构,了解它的原理和应用,看看它是如何在编程世界中为我们服务的。
一.队列的基本概念
1.1 队列的定义
队列(Queue)是一种特殊的数据结构,它按照元素进入的顺序进行排列,并遵循先进先出(FIFO, First In First Out)的原则。队列可以被看作是一个有序的元素集合,其中元素的添加(入队)发生在集合的一端(通常称为“队尾”),而元素的移除(出队)则发生在另一端(通常称为“队头”)。
1.2 队列的特性
-
先进先出(FIFO):这是队列最显著的特点。元素按照加入队列的顺序被处理,即最早进入队列的元素会最先被移除。
-
有序性:由于FIFO原则,队列中的元素始终保持有序状态。
-
动态性:队列的大小可以动态变化。在需要时,可以向队列中添加新元素(入队),也可以从队列中移除元素(出队)。
-
边界条件:队列有两个重要的边界条件——空队列和满队列(对于有限队列)。空队列表示队列中没有元素,而满队列表示队列已达到其最大容量,无法再添加新元素。然而,在实际应用中,更常见的是通过动态调整或循环使用空间来避免真正的“满”状态。
1.3 队列的基本操作
-
入队(Enqueue):向队列中添加一个新元素的操作。通常发生在队尾。
- 操作结果:队列的长度增加1。
- 时间复杂度:在大多数情况下,入队操作的时间复杂度为O(1),即常数时间。
-
出队(Dequeue):从队列中移除一个元素的操作。通常发生在队头。
- 操作结果:队列的长度减少1,并返回被移除的元素。
- 时间复杂度:同样地,在大多数情况下,出队操作的时间复杂度也为O(1)。
-
查看队头元素(Front/Peek):获取队列头部的元素但不移除它。
- 操作结果:返回队列头部的元素。
- 时间复杂度:在大多数情况下,查看队头元素的时间复杂度为O(1)。
-
检查队列是否为空(IsEmpty):判断队列中是否包含元素。
- 操作结果:返回一个布尔值,表示队列是否为空。
- 时间复杂度:检查队列是否为空的操作通常也是O(1)的。
-
获取队列的大小(Size):返回队列中当前包含的元素数量。
- 操作结果:返回一个整数,表示队列的大小。
- 时间复杂度:获取队列大小的操作通常是O(1)的。
二.队列的实现方式
队列的实现方式主要有两种:
2.1 基于链表的队列
实现方式:
链表队列使用节点(Node)来存储数据,每个节点包含数据部分和指向下一个节点的指针。队列包含两个指针,分别指向队头和队尾。入队操作在队尾添加新节点,出队操作移除队头节点。
优势:
- 动态性:链表队列可以动态调整大小,无需预分配固定空间。
- 内存利用率:没有固定的空间限制,可以根据需要分配和释放内存。
- 插入和删除效率高:在链表中插入和删除元素只需调整指针,时间复杂度为O(1)。
劣势:
- 内存开销:每个节点都需要额外的指针空间,增加了内存开销。
- 访问效率低:由于链表不是连续存储的,访问特定位置的元素需要从头节点开始遍历,时间复杂度较高。
2.2 基于数组的队列
实现方式:
数组队列使用固定大小的数组来存储元素,并使用两个索引(如front和rear)来指示队头和队尾的位置。入队操作在队尾添加元素,出队操作移除队头元素。当数组空间不足时,可以进行扩容操作(但通常不常见,因为扩容会导致性能下降)。更常见的是采用循环队列的方式,当队尾到达数组末尾时,回到数组开头继续添加元素。
优势:
- 内存利用率高:数组是连续存储的,内存利用率较高,没有额外的指针开销。
- 访问效率高:可以通过索引直接访问数组中的元素,时间复杂度为O(1)。
- 实现简单:数组队列的实现相对简单,不需要处理复杂的指针操作。
劣势:
- 固定大小:数组队列的大小是固定的,需要提前分配足够的空间。如果空间不足,可能导致性能下降或内存溢出。
- 扩容成本高:虽然可以采用扩容的方式来解决空间不足的问题,但扩容会导致额外的内存分配和数据复制操作,成本较高。
- 假溢出:在普通数组队列中,当队尾指针达到数组末尾时,即使数组中间还有空闲空间,也无法继续入队,导致“假溢出”现象。循环队列可以解决这个问题,但实现相对复杂一些。
一般情况下,基于链表的队列实现更加常见,下面我们来给出基于链表的队列的实现。
三.基于链表的队列实现
定义链表队列的结构
首先,我们定义了一个名为
QDataType
的类型别名,它基于int
类型。这个类型别名将用于队列中存储的数据元素。接着,我们定义了一个名为
QueueNode
的结构体,它代表队列中的一个节点。这个结构体包含以下两个成员:
data
:这是一个QDataType
类型的变量,用于存储队列节点的数据。next
:这是一个指向QueueNode
类型的指针,它指向队列中的下一个节点。如果这是队列的最后一个节点,则此指针通常被设置为NULL
。然后,我们定义了一个名为
Queue
的结构体(通过typedef
,我们也可以用Queue
来直接引用它,而不需要使用struct
关键字)。这个结构体代表了一个队列的数据结构,并包含以下三个成员:
phead
:这是一个指向QueueNode
类型的指针,它指向队列的头部(即队列中第一个进入的元素所在的节点)。如果队列为空,则此指针通常被设置为NULL
。ptail
:这是一个指向QueueNode
类型的指针,它指向队列的尾部(即队列中最后一个进入的元素所在的节点)。这个指针使得我们可以在队列的尾部高效地添加新元素。如果队列为空,则此指针也通常被设置为NULL
。size
:这是一个整型变量,表示队列中有效元素的个数。这个值在队列的操作过程中会动态变化,并且提供了队列当前长度的直接信息。函数代码:
typedef int QDataType; //定义队列结点的结构 typedef struct QueueNode {QDataType data;struct QueueNode* next; }QueueNode;//定义队列的结构 typedef struct Queue {QueueNode* phead;//队头QueueNode* ptail;//队尾int size; //队列有效元素个数 }Queue;
初始化
函数名称:
QueueInit
函数目的:初始化一个队列,为其分配必要的资源,并设置初始状态。
函数参数:
Queue* pq
:这是一个指向Queue
结构体的指针,指向需要被初始化的队列。函数体详细解析:
- 参数有效性检查:
- 使用
assert(pq);
语句来确保传入的指针pq
是有效的。如果pq
为NULL
,则程序会终止,并显示错误信息。- 初始化队列头部和尾部指针:
- 将
pq->phead
和pq->ptail
都设置为NULL
,表示队列在初始化时是空的,没有节点。- 初始化队列大小:
- 将
pq->size
设置为0
,表示队列中没有元素。通过
QueueInit
函数的执行,一个队列被成功初始化,其头部和尾部指针均指向NULL
,且队列大小为0
,表示队列当前为空且已准备好进行后续的入队和出队操作。函数代码:
//初始化 void QueueInit(Queue* pq) {assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0; }
入队列——向队列中插入数据
函数名称:
QueuePush
函数目的:向队列中添加一个新元素。
函数参数:
Queue* pq
:指向需要添加元素的队列的指针。QDataType x
:需要被添加到队列中的元素值。函数体详细解析:
- 参数有效性检查:
- 使用
assert(pq);
语句来确保传入的队列指针pq
是有效的。如果pq
为NULL
,则程序会终止,并显示错误信息(由断言机制提供)。- 内存分配:
- 通过
malloc(sizeof(QueueNode))
为新的队列节点分配内存。sizeof(QueueNode)
计算了QueueNode
结构体所需的内存大小。- 将分配的内存地址转换为
QueueNode*
类型,并赋值给newnode
指针。- 检查
malloc
是否成功分配了内存。如果newnode
为NULL
,则表示内存分配失败。此时,程序通过perror
函数输出错误信息,并通过exit(1)
终止执行。- 初始化新节点:
- 将传入的元素值
x
赋值给新节点的data
成员。- 将新节点的
next
成员设置为NULL
,表示这是队列中的最后一个节点(至少在当前添加操作完成时是这样)。- 更新队列的队尾和队头指针:
- 如果队列为空(即
pq->phead == NULL
),则将队头和队尾指针都指向新节点newnode
。- 如果队列不为空,则将当前队尾节点的
next
指针指向新节点newnode
,并更新队尾指针pq->ptail
,使其指向新节点。这里有一个潜在的优化点:可以直接将pq->ptail = newnode;
,因为在上一步已经确保了pq->ptail->next = newnode;
。不过,原代码中的写法在逻辑上也是正确的,只是稍微多了一次对pq->ptail
的读取操作。- 更新队列大小:
- 将队列的大小
pq->size
增加1,以反映新添加的元素。函数代码:
//入队列——向队列中插入数据 void QueuePush(Queue* pq, QDataType x) {assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!\n");exit(1);}newnode->data = x;newnode->next = NULL;//队列为空,队头和队尾都是newnodeif (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++; }
队列判空
函数名称:
QueueEmpty
函数目的:判断队列是否为空。
函数参数:
Queue* pq
:指向需要检查的队列的指针。函数体详细解析:
- 参数有效性检查:
- 使用
assert(pq);
语句来确保传入的队列指针pq
是有效的。如果pq
为NULL
,则程序会终止,并显示错误信息(由断言机制提供)。这是为了防止程序在尝试访问pq
指向的内存时发生崩溃。- 判断队列是否为空:
- 函数通过检查队列的头部指针
pq->phead
是否为NULL
来判断队列是否为空。如果pq->phead
为NULL
,则表示队列中没有节点,因此队列为空。- 这里需要注意的是,由于队列是先进先出的数据结构,只要队列的头部指针为
NULL
,就可以确定队列为空,无需检查尾部指针pq->ptail
。在正常的队列操作中,如果队列为空,头部和尾部指针都会是NULL
。但是,只检查头部指针就足以确定队列是否为空,因为只要有一个节点存在,头部指针就不会是NULL
。- 返回值:
- 函数返回一个布尔值。如果队列为空,则返回
true
(或非零值,在C语言中通常使用1
表示真);如果队列不为空,则返回false
(或零值)。函数代码:
//队列判空 bool QueueEmpty(Queue* pq) {assert(pq);//队列为空时,头为空或头和尾均为空return pq->phead == NULL; }
队列有效元素个数
函数名称:
QueueSize
函数目的:获取队列中有效元素的个数。
函数参数:
Queue* pq
:指向需要查询的队列的指针。函数体解析:
这个函数非常简单,它直接返回队列结构体中存储的元素个数
pq->size
。这个size
字段通常是在队列操作过程中维护的,以确保它始终反映队列中当前有效元素的数量。函数代码:
//队列有效元素个数 int QueueSize(Queue* pq) {return pq->size; }
出队列——从队列中删除数据
函数名:
QueuePop
目的:从队列中删除(出队)最前面的数据元素。
参数:
Queue* pq
:指向需要操作的队列的指针。该队列应该是一个有效的队列,即pq
不应为NULL
,且队列不应为空。函数体详细解析:
- 参数有效性检查:
assert(pq);
:确保传入的队列指针pq
是有效的,即不是NULL
。如果pq
为NULL
,则程序会在这里终止,并显示错误信息(由断言机制提供)。assert(!(QueueEmpty(pq)));
:确保队列不为空。这是通过调用QueueEmpty
函数来实现的,该函数应该返回一个布尔值,指示队列是否为空。如果队列为空,则QueueEmpty(pq)
将返回true
(或非零值),而!(QueueEmpty(pq))
将返回false
(或零值),这将导致断言失败,程序终止。- 出队操作:
QueueNode* temp = pq->phead;
:声明一个QueueNode
类型的指针temp
,并将其初始化为队列的头节点pq->phead
。这是为了保存当前头节点的地址,以便稍后可以释放其内存。pq->phead = pq->phead->next;
:将队列的头指针pq->phead
更新为指向下一个节点。这样,原来的头节点就被从队列中移除了。- 更新尾指针:
if (pq->phead == NULL)
:检查更新后的头指针是否为NULL
。如果是,这意味着队列现在为空,因为所有的节点都已经被移除。
pq->ptail = NULL;
:如果队列为空,则将尾指针pq->ptail
也设置为NULL
。这是必要的,因为尾指针应该始终指向队列中的最后一个节点,或者如果队列为空,则应该为NULL
。- 释放内存:
free(temp);
:释放之前保存的头节点temp
的内存。这是必要的,以避免内存泄漏。- 更新队列大小:
--pq->size;
:将队列的大小pq->size
减1,以反映已经移除了一个节点。
取队头数据
函数名:
QueueFront
目的:获取队列前面的(即最先进入的)数据元素,但不从队列中移除它。
参数:
Queue* pq
:指向需要操作的队列的指针。该队列应该是一个有效的队列,即pq
不应为NULL
,且队列不应为空。返回类型:
QDataType
- 这是一个假设的数据类型,表示队列中存储的数据的类型。在实际代码中,
QDataType
应该被替换为实际的数据类型,如int
、float
、char*
等,或者是一个用户定义的结构体或类的类型。函数体详细解析:
- 参数有效性检查:
assert(pq);
:确保传入的队列指针pq
是有效的,即不是NULL
。如果pq
为NULL
,则程序会在这里终止,并显示错误信息(由断言机制提供)。assert(!QueueEmpty(pq));
:确保队列不为空。这是通过调用QueueEmpty
函数来实现的,该函数应该返回一个布尔值(通常是int
类型,其中0
表示false
,非0
表示true
),指示队列是否为空。如果队列为空,则断言失败,程序终止。- 获取队列前面的数据元素:
return pq->phead->data;
:返回队列头节点pq->phead
中存储的数据元素。这里假设QueueNode
结构体(队列节点的类型)有一个名为data
的成员,用于存储数据元素。函数代码:
//取队头数据 QDataType QueueFront(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->phead->data; }
取队尾数据
函数名:
QueueBack
目的:获取队列尾部的(即最后进入的)数据元素,但不从队列中移除它。
参数:
Queue* pq
:指向需要操作的队列的指针。该队列应该是一个有效的队列,即pq
不应为NULL
,且队列不应为空。返回类型:
QDataType
- 这是一个占位符数据类型,表示队列中存储的数据的类型。在实际代码中,
QDataType
应该被替换为实际的数据类型,如int
、float
、char*
等,或者是一个用户定义的结构体、类的类型,或者是某种形式的指针。函数体详细解析:
- 参数有效性检查:
assert(pq);
:确保传入的队列指针pq
是有效的,即不是NULL
。如果pq
为NULL
,则程序会在这里终止,并显示错误信息(由断言机制提供)。assert(!QueueEmpty(pq));
:确保队列不为空。这是通过调用QueueEmpty
函数来实现的,该函数应该返回一个布尔值(在C语言中,通常是int
类型,其中0
表示false
,非0
表示true
),指示队列是否为空。如果队列为空,则断言失败,程序终止。- 获取队列尾部的数据元素:
return pq->ptail->data;
:返回队列尾节点pq->ptail
中存储的数据元素。这里假设QueueNode
结构体(队列节点的类型)有一个名为data
的成员,用于存储数据元素。函数代码:
//取队尾数据 QDataType QueueBack(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data; }
销毁队列
函数名:
QueueDestroy
目的:销毁队列,释放其占用的所有内存资源。
参数:
Queue* pq
:指向需要销毁的队列的指针。该队列应该是一个有效的队列,即pq
不应为NULL
。但是,此函数将清空队列,即使它不是空的。返回类型:
void
- 此函数不返回任何值。
函数体详细解析:
- 参数有效性检查:
assert(pq);
:确保传入的队列指针pq
是有效的,即不是NULL
。如果pq
为NULL
,则程序会在这里终止,并显示错误信息(由断言机制提供)。这是基本的错误检查,但在实际应用中,即使pq
为NULL
,一个更健壮的实现可能会选择安静地返回而不是断言失败。- 遍历并释放队列节点:
QueueNode* pcur = pq->phead;
:声明一个QueueNode
类型的指针pcur
,并将其初始化为队列的头节点pq->phead
。while (pcur)
:使用一个循环来遍历队列中的所有节点,直到pcur
变为NULL
,表示已经到达队列的末尾。
QueueNode* next = pcur->next;
:在释放当前节点之前,先保存下一个节点的指针,以便在释放当前节点后能够继续遍历。free(pcur);
:释放当前节点的内存。pcur = next;
:将pcur
更新为下一个节点,继续循环。- 重置队列指针和大小:
pq->phead = pq->ptail = NULL;
:将队列的头指针和尾指针都设置为NULL
,表示队列现在是空的。pq->size = 0;
:将队列的大小设置为0,表示队列中没有元素。函数代码:
//销毁队列 void QueueDestroy(Queue* pq) {assert(pq);QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;pq->size = 0; }
兄弟们共勉!!!
码字不易,求个三连
抱拳了兄弟们!
相关文章:

【数据结构与算法】队列——数据世界中的“有序使者”
大家好,我是小卡皮巴拉 文章目录 目录 引言 一.队列的基本概念 1.1 队列的定义 1.2 队列的特性 1.3 队列的基本操作 二.队列的实现方式 2.1 基于链表的队列 2.2 基于数组的队列 三.基于链表的队列实现 定义链表队列的结构 初始化 入队列——向队列中插…...

yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起
之前搞过不少部署,也玩过tensorRT部署模型(但都是模型推理用gpu,后处理还是用cpu进行),有网友问能出一篇tensorRT用gpu对模型后处理进行加速的。由于之前用的都是非cuda支持的边缘芯片,没有写过cuda代码&am…...

国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明
在现代金融市场中,期货交易因其高风险和高回报特性而备受关注。为了满足期货交易者的需求,开发高效、稳定和安全的期货交易软件变得尤为重要。本文将对国际期货收费行情源CTP推送式及期货配资软件的开发对接行情源的技术细节进行详细说明。 一、CTP&…...

上拉电阻和下拉电阻在电路中的作用(一)
上拉电阻和下拉电阻在电路中的作用(一) 1.什么是上下拉电阻2.上下拉电阻的作用:2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路(Open Collector集电极开路、Open Drain漏电极开路…...

怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧
进入数字化时代,图片是目前应用广泛的一种信息传递方式,可以通过看图来获取需要的内容,那么图片如何更快捷的在更多人之间传递呢?通过将图片生成二维码后分享,可以实现图片的快速传递,制作成本也比较低&…...

perl双引号内字符串的反斜线转义
perl双引号内字符串的反斜线转义 如题,下面表格列举了perl双引号内字符串的反斜线转义: 组合意义\n换行\r回车\t水平制表符\f换页符\b退格\a系统响铃\eEsc(ASCII编码的转义字符)\007八进制表示的ASCII值(此例中007表…...

【编程语言】Kotlin快速入门 - 伴生对象与懒加载
静态与顶层方法 静态方法(伴生对象) Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,…...

三、数据聚合和函数
在数据聚合和函数方面,数据库提供了许多功能强大的函数,可以帮助你处理和分析数据。以下是一些常用的函数及其功能的详细说明: COUNT函数: COUNT函数用于计算指定列中的行数。它可以用于统计表中满足特定条件的行数,也…...

Golang | Leetcode Golang题解之第500题键盘行
题目: 题解: func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…...

如何实现金蝶商品数据集成到电商系统的SKU
如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中,系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例:如何通过轻易云数据集成平台,将金蝶云星辰V2中的商…...

100种算法【Python版】第4篇——回溯法
念念不忘,必有回响 1 回溯法原理2 示例说明2.1 生成子集2.1.1 回溯法思路2.1.2 Python3代码2.2 N皇后问题2.2.1 回溯法思路2.2.2 Python3代码3 回溯法应用3.1 组合3.1.1 回溯法思路3.1.2 Python3代码3.2 数独 Solver3.2.1 回溯法思路3.2.2 Python3代码3.3 多重背包问题3.3.1 P…...

R语言机器学习算法实战系列(九)决策树分类算法 (Decision Trees Classifier)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型模型的决策树预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模…...

听泉鉴宝在三个月前已布局商标注册!
近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万,连线出现“馆藏文物”和“盗墓现场”等内容,听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现,“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…...

vscode设置特定扩展名文件的打开编码格式
用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…...

Linux——动态卷的管理
确保已经设置了对应的动态卷的驱动(provisioner 制备器)基于动态驱动创建对应的存储类创建PVC (PVC 将会自动根据大小、访问模式等创建PV)Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…...

第三季度中国游戏市场收入创历史新高;京东物流与淘宝天猫达成合作;YouTube 上线“用相机拍摄”标签....|网易数智日报
第三季度中国游戏市场收入917.66亿,创历史新高 中国音数协游戏工委今日发布了最新的 2024 年第三季度中国游戏产业季度报告。 数据显示,2024 年第三季度中国游戏市场收入 917.66 亿元,环比增长 22.96%,同比增长 8.95%。 中国音…...

智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发
智慧城管源码,智慧城管执法办案系统源码 智慧城管综合执法办案平台是智慧城市框架下,依托物联网、云计算、多网融合等现代化技术,运用数字基础资源、多维信息感知、协同工作处置、智能化辅助决策分析等手段,形成具备高度感知、互联…...

2024Flutter面试题
1.Dart是值传递还是引用传递? dart是值传递。 每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的赋值。 2.简述Dart语音特性 在Dart中,一切都是对象,所有的对象都是继承自Object Dart是强类型语言&#…...

MySQL-23.多表查询-内连接
一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名,及所属的部门名称(隐式内连接实现) select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…...

实用的 Python 小脚本
一、引言 在日常办公和电脑使用中,我们经常会遇到一些重复性的任务或需要快速获取特定信息的情况。Python 作为一种强大而灵活的编程语言,可以用来编写各种小脚本,以自动化这些任务并提高工作效率。本文将介绍一些 Python 常用的小脚本&…...

哪种掏耳朵方式好?正确的掏耳工具!
人体的耳屎会随着活动量加大而增加,如果长期不清理,耳屎堆积在耳道深处很有可能会堵塞鼓膜甚至影响听力。但如果需要清理耳屎的话,哪种掏耳朵方式好呢?可视挖耳勺可以帮助我们在全程可视的情况下,精准有效地完成采耳&a…...

如何让别人喜欢你的代码
良好的编码习惯是编程人员的基本素养,有利于后期人员的维护和查看。 毕竟大家都喜欢美女和靓仔 目录 js函数注释规范 案例 其他 推荐链接 js函数注释规范 常用符号 说明 用法 param 参数 param {type} name return 返回值 return {type} 案例 /***…...

【Flutter】Dart:库
在 Dart 中,库(Library)是组织和重用代码的基本方式。通过库,我们可以将代码分割成模块化的部分,方便管理和共享,同时避免命名冲突。Dart 提供了大量内置库,用于支持常见的功能,比如…...

从0开始深度学习(18)——环境和分布偏移
有时,根据测试集的精度衡量,模型表现得非常出色。 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败。 有时模型的部署本身就是扰乱数据分布的催化剂。 举一个有点荒谬却可能真实存在的例子。 假设我们训练了一个贷款申请人违约风险…...

Java项目-基于springboot框架的线上买菜系统项目实战(附源码+文档)
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

API接口的未来趋势:智能化、自动化与集成化的发展
在当今数字化驱动的世界中,应用程序编程接口(API)已成为连接不同软件、平台和服务的关键桥梁。随着技术的不断进步,API接口的未来趋势将聚焦于智能化、自动化与集成化的发展。本文将深入探讨这些趋势,并分析其在推动数…...

Yolo系列 V1和V2的对比
在计算机视觉领域中,目标检测是一个核心问题,旨在识别图像中所有感兴趣的目标,并给出它们的类别和位置。近年来,随着深度学习技术的发展,目标检测领域取得了巨大的进步。Yolo(You Only Look Once࿰…...

安装vue发生异常: idealTree:nodejs: sill idealTree buildDeps
一、异常 C:\>npm install vue -g npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIREDnpm ERR! request to https://registry.npm.taobao.org/vue failed, reason: certificate has expired 二、原因 请求 https://registry.npm.taobao.org 失败,证…...

SQL基础练习
SQL语句的下载脚本链接!!! 【免费】SQL练习资源-具体练习操作可以查看我发布的文章资源-CSDN文库https://download.csdn.net/download/Z0412_J0103/89908378 1 查看所有数据库 SHOW DATABASES; 结果展示: 2 创建库 方法一&#…...

Python 如何处理大规模数据库表的迁移与数据迁移的高效执行
Python 如何处理大规模数据库表的迁移与数据迁移的高效执行 引言 在现代应用开发中,随着业务需求的增长,数据库表结构和数据往往需要进行迁移和更新。迁移(Migration)是指对数据库表的结构、数据类型、索引、约束等进行修改或更新…...