当前位置: 首页 > news >正文

2.数据结构-栈和队列

数据结构-栈和队列

  • 2.1栈
    • 2.1.1栈的表示和实现
    • 2.1.2栈的应用举例
      • 数制转换
      • 括号匹配检验
      • 迷宫给求解
      • 表达式求值
    • 2.1.3链栈的表示和实现
    • 2.1.4栈与递归的实现
      • 遍历输出链表中各个结点的递归算法
      • *Hanoi塔问题的递归算法
  • 2.2队列
      • 2.2.1循环队列——队列的顺序表示和实现
      • 2.2.2链队——队列的链式表示和实现

2.1栈

栈是限定仅在表尾进行插入或删除操作的线性表,因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头称为栈底

在这里插入图片描述
E为栈底元素,A为栈顶元素。也就意味着,栈的修改是按后进先出的原则进行的。因此栈又称为后进先出线性表(简称LIFO结构)。

2.1.1栈的表示和实现

和线性表类似,栈也有两种存储表示方式。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法是top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如设定会带来很大不便;另一方面,由于栈在使用过程中所需最大空间的大小很难估计,一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法是;先分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐段扩大。为此可设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)和STACKINCREMENT(存储空间分配增量)。

top 并不是栈顶元素,而是指向栈顶元素的下一个位置。
top - 1 才是真正的栈顶元素位置。

typedef struct{SElemType *base; //栈底指针SElemType *top;  //栈顶指针,其初值指向栈底int stacksize;   //栈当前可使用的最大容量//每当插入心得栈顶元素时,指针top+1
};

顺序栈所有操作汇总:

#include<stdio.h>
#include<stdlib.h>#define SElemType  int
#define STACK_INIT_SIZE 100 //存储空间初始分配量 
#define STACKINCREMENT 10   //存储空间分配增量
#define Status inttypedef struct{SElemType *base;SElemType *top;int stacksize;
} SqStack; Status InitStack (SqStack &S){//构造一个空栈S.base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType));if(!S.base) exit(0); //存储分配失败S.top = S.base;S.stacksize =  STACK_INIT_SIZE;return 1;
}Status Push(SqStack &S, SElemType e){//插入元素e为新的栈顶元素if(S.top - S.base >= S.stacksize){ //栈满.追加存储空间 S.base = (SElemType *) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));if(!S.base) exit(0); //存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT; } *S.top++ = e;return 1;
}Status Pop(SqStack &S, SElemType &e){//若栈不为空,则删除S的栈顶元素,用e返回其值if(S.top == S.base) return 0; //空栈e = * --S.top; //先将S.top赋值给e,再自减return 1; 
}Status GetTop(SqStack &S, SElemType &e){//若栈不为空,则用e返回S的栈顶元素if(S.top == S.base) return 0;e = *(S.top - 1);return 1; 
}int StackLength(SqStack &S){//返回栈的元素个数,即栈的长度 return S.top - S.base;
}int StackEmpty(SqStack &S){//返回栈是否为空,为空返回0,不为空返回1if(!StackLength(S)) return 0;return 1; 
}void ClearStack(SqStack &S){//把S置为空栈S.top = S.base; 
}void DestroyStack(SqStack &S){//销毁栈 if(S.base){free(S.base);S.base = S.top = NULL;S.stacksize = 0;}
}int main()
{SqStack S;InitStack(S);Push(S, 1);Push(S, 2);int e; Pop(S, e);printf("%d\n", e);GetTop(S, e);printf("%d\n", e);int l = StackLength(S);printf("length: %d\n", l);return 0; 
}

2.1.2栈的应用举例

数制转换

将十进制数N和其他d进制数的转换。算法原理如下:
N = ( N / d ) ∗ d + N m o d d N = (N/d)*d+N \ \ mod \ \ d N=(N/d)d+N  mod  d
要求: 对于输入的任意一个非负十进制整数,打印与其等值的八进制数。

//栈的操作与2.1.1中代码相同
int main()
{SqStack S;InitStack(S);printf("请输入一个非负的十进制数: ");int numT;scanf("%d", &numT);while(numT){Push(S, numT % 8);numT /= 8;} int e;while(StackEmpty(S)){Pop(S, e);printf("%d", e);}return 0; 
}

括号匹配检验

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套顺序随意,即()为正确格式,[{]为不正确格式。
要求: 输入只含圆括号和方括号的字符串,判断其是否是正确的格式。

//要加上#include<string.h> 
int main()
{SqStack S;InitStack(S);char str[100];printf("输入只含圆括号和方括号的字符串: ");scanf("%s", str);int length = strlen(str), i, flag = 1, e;//(为1, )为2, [为3, ]为4 for(i = 0; i < length; i ++){if(str[i] == '[') Push(S, 3);if(str[i] == '(') Push(S, 1);if(str[i] == ')') {GetTop(S, e);if(e == 1) Pop(S, e);} if(str[i] == ']') {GetTop(S, e);if(e == 3) Pop(S, e);}}if(!StackEmpty(S)) printf("%s是合法字符串\n", str);else printf("%s不是合法字符串\n", str);return 0; 
}

迷宫给求解

链接: C语言 严蔚敏 数据结构 迷宫求解_顺序栈应用

类似于深度优先搜索,用栈去模拟这个过程。

表达式求值

链接: C语言 严蔚敏 数据结构 表达式求值_顺序栈应用
类似于括号匹配检验。

2.1.3链栈的表示和实现

链栈是指采用链式存储结构实现的栈。通常链栈用单链表来实现。
在这里插入图片描述
由于栈的主要操作是在栈顶插入和删除,显然以链表的头部作为栈顶是最方便的。

#include<stdio.h>
#include<stdlib.h>#define List_Init_Size 100 //线性表存储空间的初始分配量
#define ListIncreMent 10   //线性表存储空间的分配增量
#define ElemType int
#define Status inttypedef struct StackNode{ElemType data;struct StackNode *next;
}StackNode, *LinkStack;Status InitStack(LinkStack &S) {// 构造一个空栈,栈顶指针为空S = NULL;return 1;
}Status Push(LinkStack &S, ElemType e) {//和顺序栈的入栈不同,链栈的入栈前不需要判断栈是否满,只需要为入栈动态分配一个节点空间StackNode *p = (StackNode *)malloc(sizeof(StackNode)); // 使用 malloc 分配内存if (p == NULL) {// 内存分配失败的处理return 0;}p->data = e;p->next = S;S = p;  // 栈顶指针指向新节点return 1;
}Status Pop(LinkStack &S, ElemType &e) {if (S == NULL) {return 0;  // 空栈,返回失败}e = S->data;  // 获取栈顶元素StackNode *p = S;  // 声明指针 p,指向栈顶元素S = S->next;  // 将栈顶指针指向下一个元素free(p);  // 释放栈顶元素的内存return 1;  // 返回成功
}ElemType GetTop(LinkStack S){//返回S的栈顶元素 if(S != NULL) return S->data;
}int main()
{LinkStack S;InitStack(S);int i, e;for(i = 1; i <= 10; i ++){Push(S, i);}Pop(S, e);printf("%d\n", e);
} 

2.1.4栈与递归的实现

对于链表,其结点LNode的定义由数据域data和指针域next组成,而指针域next是一种指向LNode类型的指针,即LNode的定义中又用到了其自身所以链表是一种递归的数据结构。

遍历输出链表中各个结点的递归算法

算法从前向后遍历输出链表结点的递归算法,直到p为NULL时递归结束,在递归过程中,p不断指向后续节点。

#include<stdio.h>
#include<stdlib.h>#define List_Init_Size 100 //线性表存储空间的初始分配量
#define ListIncreMent 10   //线性表存储空间的分配增量
#define ElemType int
#define Status inttypedef struct LNode{ElemType      data;struct LNode  *next;
}LNode, *LinkList;void CreateList_L(LinkList &L, int n)
{// 尾插法L = (LinkList) malloc(sizeof (LNode));L->next = NULL;    LinkList tail = L;  // tail指向链表的尾部printf("请输入\n");                                 //先建立一个带头结点的单链表for (int i = n; i > 0; --i){LinkList p = (LinkList) malloc(sizeof (LNode)); //生成新结点scanf("%d", &p->data);p->next = NULL;tail->next = p;tail = p;}
}
void TraverseList(LinkList p){if(p == NULL) return;else{printf("%d\n", p->data);TraverseList(p->next);}
}
int main()
{LinkList L;int i, e;CreateList_L(L, 10);TraverseList(L->next);return 0;
} 

*Hanoi塔问题的递归算法

#include<stdio.h>
#include<stdlib.h>int m = 0;void move(char A, int n, char C){ //将编号为n的圆盘从A移到C printf("%d, %d, %c, %c\n", ++m, n, A, C);
}void Hanoi(int n, char A, char B, char C){if(n == 1) move(A, 1, C); //将编号为1的圆盘从A移到Celse{Hanoi(n-1, A, C, B); //将A上编号1~n-1的圆盘移到B, C做辅助塔move(A, n, C);       //将编号为n的圆盘从A到CHanoi(n-1, B, A, C); //将B上编号为1~n-1的圆盘移到C, A做辅助塔	} 
}int main()
{int n = 3;Hanoi(n, 'A', 'B', 'C');return 0;
} 

递归算法的时间复杂度为 O ( 2 n ) O(2^n) O(2n),空间复杂度则为 O ( n ) O(n) O(n)

2.2队列

队列的操作与栈的操作类似,不同的是,删除实在表的头部(即队头)进行。

队列(Queue)是一种 先进先出(FIFO,First-In-First-Out)的线性数据结构,它的基本特点是元素的插入发生在队尾,而元素的删除发生在队头。队列通常用来处理需要按照顺序处理的数据,类似于排队的过程。

2.2.1循环队列——队列的顺序表示和实现

队列也有两种表示,顺序表示和链式表示。

在队列的顺序存储结构中,除了用一组连续的存储单元依次存放从队列头到队列尾的元素外,尚需要附设两个整型变量front和rear分别指示队列头元素和队列尾元素的位置。在初始化创建空队列时,令front = rear = 0,每当插入新的队列尾元素,尾指针+1,每当删除队列头元素
时,头指针front+1。在非空队列中头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置

为了避免队列实际空间并未占满而出现“假溢出现象”,我们将顺序队列变为一个环状的空间,称为循环队列。头尾指针以及队列元素之间关系不变,只是在循环队列中,头尾指针“依环状态增1”的操作可用“模”运算来实现。通过取模,头指针和尾指针就可以在顺序表空间内以头尾衔接的方式“循环移到”。

假溢出现象解释:就是因为删除操作会让头指针+1,导致头指针之前的空间就不会被利用起来,而当尾指针的值到达队列的空间最大值时,就会产生假溢出了。

如何判断队列是否为空或者队列是否已满
少用一个元素空间,即队列空间大小为m时,有m-1个元素就认为是队满。即当头尾指针的值相同时,则认为队空;而当尾指针在循环意义上+1后是等于头指针则认为队满。
队空的条件: Q . f r o n t = Q . r e a r Q.front = Q.rear Q.front=Q.rear
队满的条件:$ Q.front = (Q.rear+1)%MAXQSIZE $

#include<iostream>#define MAXQSIZE 100
#define QElemType int
#define Status intusing namespace std;typedef struct{QElemType *base;  // 存储空间的基地址int front;         // 队头指针int rear;          // 队尾指针
} SqQueue;Status InitQueue(SqQueue &Q) {// 构造一个空队列QQ.base = new QElemType[MAXQSIZE];if(!Q.base) exit(0);Q.front = Q.rear = 0;return 1;  // 返回成功
}int QueueLength(SqQueue Q){//返回Q的元素个数return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}Status EnQueue(SqQueue &Q, QElemType e){//插入元素e为Q的新的队尾元素if((Q.rear + 1) % MAXQSIZE == Q.front){ //队满return 0;}Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXQSIZE;return 1;
}Status DeQueue(SqQueue &Q, QElemType &e){//删除Q的队头元素,用e返回其值if(Q.front == Q.rear) return 0; //队空e = Q.base[Q.front];Q.front = (Q.front + 1) %MAXQSIZE;return 1;
}QElemType GetHead(SqQueue Q){//返回Q的队头元素,不修改队头指针if(Q.front != Q.rear) return Q.base[Q.front];
}int main()
{SqQueue Q;InitQueue(Q);for(int i = 1; i <= 10; i ++){EnQueue(Q, i);}int e = GetHead(Q);cout << e << endl;return 0;} 

2.2.2链队——队列的链式表示和实现

在这里插入图片描述
一个链队需要两个分别指示队头和队尾的指针才能唯一确定,给链队添加一个头结点,并令指针始终指向头结点。
链队的操作即为单链表插入和删除操作的特殊情况,只是需进一步修改尾指针或头指针。
在这里插入图片描述
这个图对于理解链队很重要

#include<iostream>#define MAXQSIZE 100
#define QElemType int
#define Status intusing namespace std;typedef struct QNode{QElemType data;struct QNode *next;
} QNode, *QueuePtr; //链队的每个结点typedef struct{QueuePtr front;QueuePtr rear;
}LinkQueue; //这就是链队的头指针Status InitQueue(LinkQueue &Q){//构造一个空队列QQ.front = Q.rear = new QNode;Q.front->next = NULL;return 1;
}Status EnQueue(LinkQueue &Q, QElemType e){//插入元素e为Q的队尾元素QueuePtr p = new QNode; //新节点分配内存 **p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;  //类似尾插法return 1;
}Status DeQUeue(LinkQueue &Q, QElemType &e){//删除Q的队头元素if(Q.front == Q.rear) return 0; //空队QueuePtr p = Q.front;e = p->data;Q.front->next = p->next;  //修改头指针if(Q.rear == p) Q.rear = Q.front; //删除的最后一个元素delete p;return 1;
}QElemType GetHead(LinkQueue Q){//返回Q的队头元素,不修改队头指针if(Q.front != Q.rear)return Q.front->next->data;
}int main()
{LinkQueue Q;InitQueue(Q);for(int i = 1; i <= 10; i ++){EnQueue(Q, i);}cout << GetHead(Q) << endl;return 0;} 

在这里插入图片描述

相关文章:

2.数据结构-栈和队列

数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1.3链栈的表示和实现2.1.4栈与递归的实现遍历输出链表中各个结点的递归算法*Hanoi塔问题的递归算法 2.2队列2.2.1循环队列——队列的顺序表示和实现2.2.2链队——队列…...

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容&#xff1a; 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…...

MySQL 中,SELECT ... FOR UPDATE

在 MySQL 中&#xff0c;SELECT ... FOR UPDATE 语句会对查询结果集中的行加排他锁&#xff08;X 锁&#xff09;。关于其他事务是否能读取当前行&#xff0c;以下是详细说明&#xff1a; 1. 排他锁&#xff08;X 锁&#xff09;的特性 排他锁是一种独占锁&#xff0c;加锁后&…...

云服务运维智能时代:阿里云操作系统控制台

阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具&#xff0c;专为简化用户的运维工作而设计。它采用智能化和可视化的方式&#xff0c;让运维变得更加高效、直观。借助AI技术&#xff0c;控制…...

【Agent的革命之路——LangGraph】如何使用config

有时我们希望在调用代理时能够对其进行配置。这包括配置使用哪个语言模型&#xff08;LLM&#xff09;等例子。下面我们将通过一个示例来详细介绍如何进行这样的配置。 在介绍 configurable 之前我们先介绍一下 Langchain 的 RunnableConfig。RunnableConfig是一个配置对象&…...

ArcGIS操作:15 计算点的经纬度,并添加到属性表

注意&#xff1a;需要转化为地理坐标系 1、打开属性表&#xff0c;添加字段 2、计算字段&#xff08;以计算纬度为例 !Shape!.centroid.Y ) 3、效果...

Docker基础入门

第 1 章&#xff1a;核心概念与安装配置 本章首先介绍Docker 的三大核心概念&#xff1a; 镜像 (Image)容器&#xff08;Container)仓库&#xff08;Repository&#xff09; 只有理解了这三个核心概念&#xff0c;才能顺利地理解Docker容器的整个生命周期。 随后&#xff0…...

【Linux】详谈 基础I/O

目录 一、理解文件 狭义的理解&#xff1a; 广义理解&#xff1a; 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open ​编辑 open返回值 写入文件 读文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…...

爬虫案例七Python协程爬取视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例七协程爬取视频 提示&#xff1a;以下是本篇文章正文…...

[20250304] 关于 RISC-V芯片 的介绍

[20250304] 关于 RISC-V芯片 的介绍 1. 调研报告 一、RISC-V 芯片结构分析 RISC-V 芯片基于开源指令集架构&#xff08;ISA&#xff09;&#xff0c;其核心优势在于模块化设计与高度灵活性。 指令集架构 基础指令集&#xff1a;包含 RV32I&#xff08;32 位&#xff09;、R…...

一学就会:A*算法详细介绍(Python)

&#x1f4e2;本篇文章是博主人工智能学习以及算法研究时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在&am…...

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…...

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…...

23种设计模式简介

一、创建型&#xff08;5种&#xff09; 1.工厂方法 总店定义制作流程&#xff0c;分店各自实现特色披萨&#xff08;北京店-烤鸭披萨&#xff0c;上海店-蟹粉披萨&#xff09; 2.抽象工厂 套餐工厂&#xff08;家庭装含大披萨薯条&#xff0c;情侣装含双拼披萨红酒&#…...

python fire 库与 sys.argv 处理命令行参数

fire库 Python Fire 由Google开发&#xff0c;它使得命令行接口&#xff08;CLI&#xff09;的创建变得容易。使用Python Fire&#xff0c;可以将Python对象&#xff08;如类、函数或字典&#xff09;转换为可以从终端运行的命令行工具。这能够以一种简单而直观的方式与你的Py…...

PDF处理控件Aspose.PDF,如何实现企业级PDF处理

PDF处理为何成为开发者的“隐形雷区”&#xff1f; “手动调整200页PDF目录耗时3天&#xff0c;扫描件文字识别错误导致数据混乱&#xff0c;跨平台渲染格式崩坏引发客户投诉……” 作为开发者&#xff0c;你是否也在为PDF处理的复杂细节消耗大量精力&#xff1f;Aspose.PDF凭…...

Spring(1)——mvc概念,部分常用注解

1、什么是Spring Web MVC&#xff1f; Spring MVC 是一种基于 Java 的实现了 MVC&#xff08;Model-View-Controller&#xff0c;模型 - 视图 - 控制器&#xff09;设计模式的 Web 应用框架&#xff0c;它是 Spring 框架的一个重要组成部分&#xff0c;用于构建 Web 应用程序。…...

C语言(23)

字符串函数 11.strstr函数 1.1函数介绍&#xff1a; 头文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一个字符串&#xff08;str1&#xff09;中寻找另外一个字符串&#xff08;str2&#xff09;是否出现过 如果找到…...

Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们&#xff0c;你们好呀&#xff01;今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册&#xff0c;并…...

基于SpringBoot的在线付费问答系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机&#xff1a; 1、理解&#xff1a; 2、内核态与用户态&#xff1a; 1、概念&#xff1a; 2、重谈地址空间&#xff1a; 3、处理时机&#xff1a; 补充知识&#xff1a; 1、sigaction&#xff1a; 2、函数重入&#xff1a; 3、volatile&…...

pandas——to_datatime用法

Pandas中pd.to_datetime的用法及示例 pd.to_datetime 是 Pandas 库中用于将字符串、整数或列表转换为日期时间&#xff08;datetime&#xff09;对象的核心函数。它在处理时间序列数据时至关重要&#xff0c;能够灵活解析多种日期格式并统一为标准时间类型。以下是其核心用法及…...

《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》

在数字化浪潮汹涌澎湃的当下&#xff0c;大数据已然成为推动各行业发展的核心动力。身处这一时代洪流&#xff0c;企业对数据的处理与分析能力&#xff0c;直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作&#xff0c;凭借强大的数据处理与分析能力&…...

Java 大视界 -- 基于 Java 的大数据实时数据处理框架性能评测与选型建议(121)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

多线程-JUC

简介 juc&#xff0c;java.util.concurrent包的简称&#xff0c;java1.5时引入。juc中提供了一系列的工具&#xff0c;可以更好地支持高并发任务 juc中提供的工具 可重入锁 ReentrantLock 可重入锁&#xff1a;ReentrantLock&#xff0c;可重入是指当一个线程获取到锁之后&…...

DeepSeek:中国AGI先锋,用技术重塑通用人工智能的未来

在ChatGPT掀起全球大模型热潮的背景下&#xff0c;中国AI领域涌现出一批极具创新力的技术公司&#xff0c;深度求索&#xff08;DeepSeek&#xff09;​便是其中的典型代表。这家以“探索未知、拓展智能边界”为使命的AI企业&#xff0c;凭借长文本理解、逻辑推理与多模态技术的…...

Vue 框架深度解析:源码分析与实现原理详解

文章目录 一、Vue 核心架构设计1.1 整体架构流程图1.2 模块职责划分 二、响应式系统源码解析2.1 核心类关系图2.2 核心源码分析2.2.1 数据劫持实现2.2.2 依赖收集过程 三、虚拟DOM与Diff算法实现3.1 Diff算法流程图3.2 核心Diff源码 四、模板编译全流程剖析4.1 编译流程图4.2 编…...

Python爬虫获取淘宝快递费接口的详细指南

在电商运营中&#xff0c;快递费用的透明化和精准计算对于提升用户体验、优化物流成本以及增强市场竞争力至关重要。淘宝提供的 item_fee 接口能够帮助开发者快速获取商品的快递费用信息。本文将详细介绍如何使用 Python 爬虫技术结合 item_fee 接口&#xff0c;实现高效的数据…...

基于BMO磁性细菌优化的WSN网络最优节点部署算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 无线传感器网络&#xff08;Wireless Sensor Network, WSN&#xff09;由大量分布式传感器节点组成&#xff0c;用于监测物理或环境状况。节点部署是 WSN 的关键问…...

Android Activity的启动器ActivityStarter入口

Activity启动器入口 Android的Activity的启动入口是在ActivityStarter类的execute()&#xff0c;在该方法里面继续调用executeRequest(Request request) &#xff0c;相应的参数都设置在方法参数request中。代码挺长&#xff0c;分段现在看下它的实现&#xff0c;分段一&#x…...