数据结构(ing)
学习内容
指针
指针的定义:
指针是一种变量,它的值为另一个变量的地址,即内存地址。
指针在内存中也是要占据位置的。
指针类型:
指针的值用来存储内存地址,指针的类型表示该地址所指向的数据类型并告诉编译器如何解释该指针所指向的内存中的数据。
指针的初始化:
指针的赋值是运用&这个操作符完成的,用于产生操作数的内存地址。
指针的运用(取值):
运用单目操作符*来取出指针所指向的内存块的值
int a = 921; int* b = &a; // b取得a在内存中的起始位置 int c = *b; // 得到b指向的内存块的值printf("a在内存中的起始地址为 %p \n", (void*)b);printf("b指针在内存中所指向的值为 %d \n", c);

练习:
*&a = 25
理解:
&a表示取a的起始地址,*(&a)表示取(&a)所指向的内存块的值
所以其实这个意思就是a=25
线性表
概念
定义:
具有相同特性的数据元素的一个有限序列,由n (n >= 0) 个数据元素(结点)a1、a2、a3.....an组成的有限序列。包括起始节点、终端节点、数据元素......
存储结构:
1.顺序存储结构:
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
2.链式存储结构:
结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。访问时只能通过头指针进入链表。
顺序存储结构(顺序表)
优点:以物理位置相邻表示逻辑关系,任一元素均可随机存取,存储密度大。
缺点:在插入、删除某一元素时,需要移动大量元素,浪费存储空间,属于静态存储形式,数据元素的个数不能自由扩充。
特点: 地址连续、依次存放、随机存取 、类型相同
存储表示
逻辑结构:(a1,a2,a3,...... an)
存储结构:
顺序表的定义
顺序表的数组下标是从0开始的
数组静态分配
#define N 100typedef struct {int e;
} Node;typedef struct { Node element[N]; //静态分配数组int length; //存储顺序表的长度
} SqList;
数组动态分配
typedef struct {int e;
} Node;typedef struct { Node *element; //动态分配数组int length; //存储顺序表的长度
} SqList;
顺序表的基本操作
初始化线性表
// 线性表的初始化
bool InitList_Sq(SqList &L, int n)
{// 分配内存L.element = (Node*)malloc(sizeof(Node)*n); if (!L.element) return false; //分配失败L.length = 0; // 初始化空表长度为0return true; // 初始化成功
}
销毁线性表
// 销毁线性表
void DestroyList(SqList &L)
{if (L.element) delete L.element; // 释放存储空间
}
清空线性表
// 清空线性表
void ClearList(SqList &L)
{L.length = 0; //将线性表的长度置为0
}
求线性表的长度
// 求线性表的长度
int GetLength(SqList L)
{return L.length;
}
判断线性表是否为空
// 判断线性表是否为空
bool IsEmpty(SqList L)
{if (L.length == 0) return true;else return false;
}
顺序表取值
// 顺序表的取值(根据位置获取元素)
bool GetElement(int idx, SqList L, Node &e)
{if (idx < 1 || idx > L.length) return false;e = L.element[idx - 1];return true;
}
按值查找
// 按值查找
int LocateElem(SqList L, Node e)
{for (int i = 0; i < L.length; i ++){if (L.element[i].e == e.e) return i + 1;}return 0; // 查找失败
}
顺序表的插入

// 顺序表的插入
bool ListInsert_Sq(SqList &L, int idx, Node e)
{if (idx < 1 || idx > L.length + 1) return false;for (int i = L.length - 1; i >= idx - 1; i --){L.element[i + 1] = L.element[i];}L.element[idx - 1] = e;L.length ++;return true;
}
顺序表的删除

// 顺序表的删除
bool ListDelete_Sq(SqList &L, int idx)
{if (idx < 1 || idx > L.length) return false;for (int i = idx; i < L.length; i ++){L.element[i - 1] = L.element[i];}L.length --;return true;
}
链式存储结构(链表)
定义:
n个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。
概念表示:
结点:
数据元素的存储映像称为结点,它由数据域和指针域两部分组成。
特殊结点:
- 头结点:在链表的首元结点之前额外设置的一个结点。
- 首元结点:链表中存储第一个数据元素a1的结点
数据域:存储当前结点的数据。
指针域:存储下一个节点的位置。

头指针:
指向链表中第一个节点的指针。
链表:
链表分为单链表、双链表、循环链表。
- 单链表:结点只有一个指针域,存储的是下一个节点的地址。
- 双链表:结点有两个指针域。存储相邻两个结点的地址。
- 循环链表:是一种头尾相接的链表,表中的最后一个结点的指针域指向头结点,整个链表形成一个环。

存储表示:
逻辑结构:(a1,a2,a3,...... an)
存储结构:
第一种 (无头结点) :

第二种(有头结点):

空表
1.无头结点时,头指针为空时表示空表,表示空表。
2.有头结点时,头结点的指针域为空时,表示空表。
单链表
数组模拟单链表:数组模拟单链表文章浏览阅读118次。数组模拟单链表https://blog.csdn.net/m0_73569492/article/details/128693718?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220bb3388a11ebbfdf7502eedcb53293d6%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=0bb3388a11ebbfdf7502eedcb53293d6&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-128693718-null-null.nonecase&utm_term=%E5%8D%95%E9%93%BE%E8%A1%A8&spm=1018.2226.3001.4450
链表定义
定义了两种类型:LNode 为结构体类型;LinkList 为指向该结构体类型的指针类
typedef struct {int e;
} Data;typedef struct Lnode {Data data; // 结点的数据域struct Lnode *next; // 结点的指针域
} LNode, *LinkList; // 定义了两种类型:LNode 为结构体类型;LinkList 为指向该结构体类型的指针类型。
LinkList L; // 定义链表L
LNode *p; // 定义结点指针
LinkList q; //定义结点指针
链表操作
初始化单链表
1.生成新节点作为头结点
2.头指针指向头结点
3.头结点的指针域指向空
分配内存:
L = (LinkList)malloc(sizeof(LNode));这一行代码调用了 malloc 函数来为一个新的 LNode 结构体分配内存。malloc 返回的是一个指向所分配内存块的指针(类型为 void*),然后通过 (LinkList) 强制转换为 LinkList 类型(即 LNode*)。此时,L 已经指向了这块新分配的内存,这块内存代表了一个新的链表节点。
// 单链表的初始化
bool InitList_L(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode)); L->next = NULL;return true;
}
判断单链表是否为空
其实就是判断头结点的指针域是否为空,如果为空,则代表是空表,如果不为空,则代表不为空表。
// 判断链表是否为空
bool IsEmpty_List(LinkList L)
{if (L->next == NULL) return true;return false;
}
单链表的销毁
销毁过程如下:

// 单链表的销毁
void Destroy_List(LinkList &L)
{LNode *p;while (L){p = L;L = L->next;free(p);}
}
清空单链表
// 清空单链表
void Clear_List(LinkList &L)
{LNode *p;while (L->next) {p = L->next;L->next = p->next;free(p);}
}
求单链表的表长
// 求单链表的表长
int Caculate_Length(LinkList L)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next)cnt ++;return cnt;
}
根据位置获取元素
// 取值-取单链表中第idx个元素的内容
bool GetElement(LinkList L, Data &e, int idx)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next){cnt ++;if (cnt == idx) {e = p->data;return true;} }return false;
}
按值查找
// 按值查找-根据数据获取该数据所在位置
int GetIdx(LinkList L, Data &element)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next){cnt ++;if (p->data.e == element.e) return cnt; }return -1;
}
单链表的插入(任意位置)

// 单链表的插入-在第i个元素之前插入
bool Insert(LinkList &L, int idx, Data element)
{int cnt = 0;for (LNode* p = L; p->next != NULL; p = p->next){if (cnt == idx - 1){LNode *e = (LNode*)malloc(sizeof(LNode));e->data = element;e->next = p->next;p->next = e;return true;}cnt ++;} return false;
}
单链表删除元素

// 删除-删除第idx个元素
bool Delete(LinkList &L, int idx)
{int cnt = 0;for (LNode* p = L; p != NULL; p = p->next){if (cnt == idx - 1){LNode *q = p->next;p->next = q->next;free(q);return true;}cnt ++;}return false;
}
头插法

// 头插法
bool Insert_Head(LinkList &L, Data element)
{LNode *cur = (LNode*)malloc(sizeof(LNode));cur->data = element;cur->next = L->next;L->next = cur;return true;
}
尾插法
// 尾插法
bool Insert_Tail(LinkList &L, Data element)
{LNode *p = L;while (p->next){p = p->next;}LNode *cur = (LNode*)malloc(sizeof(LNode));cur->data = element;cur->next = NULL;p->next = cur;return true;
}
输出单链表
// 输出单链表
void Print_List(LinkList &L)
{for (LNode* p = L->next; p != NULL; p = p->next){printf("%d ", p->data.e);}printf("\n");
}
循环链表
优点:
从表中任意节点出发都能够找到其他结点。
注意:
当执行遍历操作时,条件与单链表不同,结束条件需要看当前节点的指针域是不是等于头结点。
链表定义:
typedef struct {int e;
} Data;typedef struct Lnode {Data data; // 结点的数据域struct Lnode *next; // 结点的指针域
} LNode, *LinkList; // 定义了两种类型:LNode 为结构体类型;LinkList 为指向该结构体类型的指针类型。
链表操作:
带头指针的:
// 循环链表的初始化
bool InitList_L(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));L->next = L;return true;
}
// 判断循环链表是否为空
bool IsEmpty_List(LinkList L)
{if (L->next == L) return true;return false;
}
// 循环链表的销毁
void Destroy_List(LinkList &L)
{LNode *p = L->next;while (p->next != L){L = L->next;free(p);p = L->next;}free(L);
}
// 清空循环链表
void Clear_List(LinkList &L)
{LNode *p;while (L->next != L){p = L->next;L->next = p->next;free(p);}
}
// 求循环链表的表长
int Caculate_Length(LinkList L)
{int len = 0;LNode *p = L;while (p->next != L){len ++;p = p->next;}return len;
}
// 取值-取循环链表中第idx个元素的内容
bool GetElement(LinkList L, Data &e, int idx)
{int len = 0;LNode *p = L;while (p->next != L){len ++;p = p->next;if (len == idx){e = p->data;return true;}}return false;
}
// 按值查找-根据数据获取该数据所在位置
int GetIdx(LinkList L, Data &element)
{int len = 0;LNode *p = L;while (p->next != L){len ++;p = p->next;if (p->data.e == element.e){return len;}}return -1;
}
// 循环链表的插入-在第i个元素之前插入
bool Insert(LinkList &L, int idx, Data element)
{int len = 0;LNode *p = L;while (p->next != L){if (len == idx - 1){LNode *q = (LNode*)malloc(sizeof(LNode));q->data = element;q->next = p->next;p->next = q;return true;}len ++;p = p->next;}return false;
}
// 删除-删除第idx个元素
bool Delete(LinkList &L, int idx)
{int len = 0;LNode *p = L;while (p->next != L){len ++;p = p->next;if (len == idx - 1){LNode *q = p->next;p->next = q->next;free(q);return true;}}return false;
}// 头插法
bool Insert_Head(LinkList &L, Data element)
{LNode *p = (LNode*)malloc(sizeof(LNode));p->data = element;p->next = L->next;L->next = p;return true;
}// 尾插法
bool Insert_Tail(LinkList &L, Data element)
{LNode *p = L;while (p->next != L){p = p->next;}LNode *q = (LNode*)malloc(sizeof(LNode));q->data = element;q->next = p->next;p->next = q;return true;
}
// 输出循环链表
void Print_List(LinkList &L)
{for (LNode* p = L->next; p != L; p = p->next){printf("%d ", p->data.e);}printf("\n");
}
带尾指针的:

// 循环链表的初始化
bool InitList_R(LinkList &R)
{R->next = R;return true;
}
// 判断循环链表是否为空
bool IsEmpty_List(LinkList R)
{if (R->next == R) return true;return false;
}
// 循环链表的销毁
void Destroy_List(LinkList &R)
{LNode *p;while (R->next != R){p = R->next;R->next = p->next;free(p);}free(R);
}
// 清空循环链表
void Clear_List(LinkList &R)
{LNode *p;while (R->next != R){p = R->next;R->next = p->next;free(p);}
}
// 求循环链表的表长
int Caculate_Length(LinkList R)
{LNode *p = R;int len = 0;while (p->next != R){len ++;p = p->next;}return len;
}
// 取值-取循环链表中第idx个元素的内容
bool GetElement(LinkList R, Data &e, int idx)
{int len = 0;LNode *p = R;while (p->next != R){len ++;p = p->next;if (len == idx){e = p->data;return true;}}return false;
}
// 按值查找-根据数据获取该数据所在位置
int GetIdx(LinkList R, Data &element)
{int len = 0;LNode *p = R;while (p->next != R){len ++;p = p->next;if (p->data.e == element.e){return len;}}return -1;
}
// 循环链表的插入-在第i个元素之前插入
bool Insert(LinkList &R, int idx, Data element)
{int len = 0;LNode *p = R;while (p->next != R){if (len == idx - 1){LNode *q = (LNode*)malloc(sizeof(LNode));q->data = element;q->next = p->next;p->next = q;return true;}len ++;p = p->next;}return false;
}
// 删除-删除第idx个元素
bool Delete(LinkList &R, int idx)
{int len = 0;LNode *p = R;while (p->next != R){len ++;p = p->next;if (len == idx - 1){LNode *q = p->next;p->next = q->next;free(q);return true;}}return false;
}// 头插法
bool Insert_Head(LinkList &R, Data element)
{LNode *p = (LNode*)malloc(sizeof(LNode));p->data = element;p->next = R->next;R->next = p;return true;
}// 尾插法
bool Insert_Tail(LinkList &R, Data element)
{LNode *p = R;while (p->next != R){p = p->next;}LNode *q = (LNode*)malloc(sizeof(LNode));q->data = element;q->next = R;p->next = q;return true;
}
// 输出循环链表
void Print_List(LinkList &R)
{for (LNode* p = R->next; p != R; p = p->next){printf("%d ", p->data.e);}printf("\n");
}
双链表
数组模拟双链表:数组模拟双链表文章浏览阅读92次。数组模拟双链表_;.ir=k,8https://blog.csdn.net/m0_73569492/article/details/128704895?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221c13d05d054d65bc8bd9b7e25466efa9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=1c13d05d054d65bc8bd9b7e25466efa9&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-128704895-null-null.nonecase&utm_term=%E5%8F%8C%E9%93%BE%E8%A1%A8&spm=1018.2226.3001.4450
链表定义
typedef struct {int e;
} Data;typedef struct Lnode {struct Lnode *pre; // 指向前驱结点Data data; // 结点的数据域struct Lnode *next; // 指向后继结点
} LNode, *LinkList; // 定义了两种类型:LNode 为结构体类型;LinkList 为指向该结构体类型的指针类型。
链表操作
// 双链表的初始化
bool InitList_L(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));L->pre = NULL;L->next = NULL;return true;
}
// 判断链表是否为空
bool IsEmpty_List(LinkList L)
{if (L->next == NULL) return true;return false;
}
// 双链表的销毁
void Destroy_List(LinkList &L)
{LNode *p;while (L){p = L;L = L->next;free(p);}
}
// 清空双链表
void Clear_List(LinkList &L)
{LNode *p;while (L->next != NULL) {p = L->next;L->next = p->next;free(p);}
}
// 求双链表的表长
int Caculate_Length(LinkList L)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next)cnt ++;return cnt;
}
// 取值-取双链表中第idx个元素的内容
bool GetElement(LinkList L, Data &e, int idx)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next){cnt ++;if (cnt == idx) {e = p->data;return true;} }return false;
}
// 按值查找-根据数据获取该数据所在位置
int GetIdx(LinkList L, Data &element)
{int cnt = 0;for (LNode* p = L->next; p != NULL; p = p->next){cnt ++;if (p->data.e == element.e) return cnt; }return -1;
}
// 双链表的插入-在第i个元素之前插入
bool Insert(LinkList &L, int idx, Data element)
{int cnt = 0;for (LNode* p = L; p->next != NULL; p = p->next){if (cnt == idx - 1){LNode *e = (LNode*)malloc(sizeof(LNode));e->data = element;e->next = p->next;e->pre = p;p->next->pre = e;p->next = e;}cnt ++;} return false;
}
// 删除-删除第idx个元素
bool Delete(LinkList &L, int idx)
{int cnt = 0;for (LNode* p = L; p != NULL; p = p->next){if (cnt == idx - 1){LNode *q = p->next;if (!q->next) {p->next = NULL;free(q);return true; }p->next = q->next;q->next->pre = p;free(q);return true;}cnt ++;}return false;
}// 头插法
bool Insert_Head(LinkList &L, Data element)
{LNode *p = (LNode*)malloc(sizeof(LNode));p->data = element;if (L->next) {p->pre = L;p->next = L->next;L->next->pre = p;L->next = p;}else{L->next = p;p->pre = L;p->next = NULL;}return true;
}// 尾插法
bool Insert_Tail(LinkList &L, Data element)
{LNode *p = L;while (p->next != NULL){p = p->next;}// 在p后面插入curLNode *cur = (LNode*)malloc(sizeof(LNode));cur->data = element;if (p->next){cur->pre = p;cur->next = p->next;p->next->pre = cur;p->next = cur;}else{p->next = cur;cur->pre = p;cur->next = NULL;}return true;
}
// 输出链表
void Print_List(LinkList &L)
{for (LNode* p = L->next; p != NULL; p = p->next){printf("%d ", p->data.e);}printf("\n");
}
相关文章:
数据结构(ing)
学习内容 指针 指针的定义: 指针是一种变量,它的值为另一个变量的地址,即内存地址。 指针在内存中也是要占据位置的。 指针类型: 指针的值用来存储内存地址,指针的类型表示该地址所指向的数据类型并告诉编译器如何解…...
杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装
JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器,简单的外部应用电路非常适合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路,不需要外部隔离二极管。热反馈可对充电电流进…...
webpack5基础(上篇)
一、基本配置 在开始使用 webpack 之前,我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1)entry (入口) 指示 webpack 从哪个文件开始打包 2)output(输出) 制视 webpack 打包完的…...
快速理解MIMO技术
引言 在无线通信领域,MIMO(Multiple-Input Multiple-Output,多输入多输出)技术是一项革命性的进步,它通过在发射端和接收端同时使用多个天线,极大地提高了通信系统的容量、可靠性和覆盖范围。本文简要阐释其…...
【RTD MCAL 篇3】 K312 MCU时钟系统配置
【RTD MCAL 篇3】 K312 MCU时钟系统配置 一,文档简介二, 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...
探索Docker Compose:轻松管理多容器应用
探索Docker Compose:轻松管理多容器应用 在现代软件开发中,容器化已经成为构建、部署和扩展应用的主流方式。而Docker Compose作为Docker生态系统的重要组成部分,可以简化多容器应用的管理。本文将深入探讨Docker Compose的核心功能及应用场…...
计算机网络 (18)使用广播信道的数据链路层
一、广播信道的基本概念 广播信道是一种允许一个发送者向多个接收者发送数据的通信信道。在计算机网络中,广播信道通常用于局域网(LAN)内部的主机之间的通信。这种通信方式的主要优点是可以节省线路,实现资源共享。 二、广播信道数…...
【vLLM 学习】欢迎来到 vLLM!
vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ vLLM 是一个快速且易于使用的库,专为大型语言模型 (LLM) 的推理和部署…...
现代网络基础设施中的 TCP 握手之下
TCP 3 次握手 在最简单的形式中,TCP 三次握手很容易理解,并且有 大量在线材料都在讨论这个问题。(如果你能读懂 Chinease,你可以看看我之前的一篇文章。 然而,在实际中理解、练习和解决 TCP 问题 世界是另一回事。随…...
GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)
前言 24年具身前沿模型大汇总 过去的这两年,工作之余,我狂写大模型与具身的文章,加之具身大火,每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然,也欢迎各大开发团队与我司合作共同交付)…...
NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)
Accepted by NeurIPS 2024 文章链接:https://arxiv.org/pdf/2412.19806 项目链接:https://vitron-llm.github.io/ Github链接:https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型(MLLM&…...
中药和西药的区别
中药和西药的区别 一、定义与来源 (一)中药 中药主要是在中国传统医学理论指导下用于预防、诊断、治疗疾病或调节人体机能的药物。它的来源广泛,包括植物药、动物药、矿物药等。植物药是中药的主要组成部分,例如人参࿰…...
Spring Security(maven项目) 3.0.2.4版本
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
【Ubuntu】安装华为的MindSpore
目录 1 安装Anaconda 2 更换国内源 3 安装MindSpore 1 安装Anaconda 2 更换国内源 具体方法如下: 打开命令行 cmd 工具,输入以下命令。 ① Conda 换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ c…...
【模型】Qwen2-VL 服务端UI
1. 前言 最近在测试VLM模型,发现官方的网页demo,代码中视频与图片分辨率可能由于高并发设置的很小,导致达不到预期效果,于是自己研究了一下,搞了一个简单的前端部署,自己在服务器部署了下UI界面࿰…...
计算机网络•自顶向下方法:网络层介绍、路由器的组成
网络层介绍 网络层服务:网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端:将传输层报文段封装到网络层分组中,发送给边缘路由器路由器:将分组从输入链路转发到输出链路接收终端࿱…...
安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
最近客户想要做一个台灯产品,需要实现 串口调节台灯功能 ,其中包括 亮度调节 色温调节 开关 三个功能 话不多说,贴代码 diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml old mode 100644 new …...
多个线程处理不同的数据,等线程都完成后再进行下一步操作
现在有三个任务,三个任务之间没有关联关系,但是第四个任务要等前三个完成之后才能进行,于是使用多线程完成前三个任务节省时间 示例代码: public void saveDataByOnlineTimeNew(LocalDateTime startTime, LocalDateTime endTime) {Objects.requireNonNull(startTime, "开…...
聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载
聆听音乐手机版是面向广大音乐爱好者的移动应用程序,用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能,让用户在手机上畅享更舒适的音乐体验,每位用户都能享受精彩纷呈的收听体验。此外,软件还支持无损音质音乐…...
Rust 基础入门指南
Rust 基础入门指南 1. Rust 语言概述 Rust 的历史与设计理念 Rust 是由 Mozilla 研究院的 Graydon Hoare 于2010年开始创建的系统编程语言。其设计目标是创建一种安全、并发、实用的编程语言,特别关注内存安全和并发性。 Rust 的核心设计理念包括: …...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...


