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

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

  • 一、概念
    • 1.1 队列的基本概念
    • 1.2 队列的顺序存储结构
      • 1.21 顺序队列(静态队列)
      • 1.22 循环队列
      • 1.23 优先级队列
    • 1.3 队列的链式存储结构
  • 二、C语言实现
    • 2.1 顺序存储
      • 2.11 顺序队列
      • 2.12 循环队列
      • 2.13 优先级队列
    • 2.2 链式存储

一、概念

1.1 队列的基本概念

队列(queue)是一种常见的数据结构,它遵循先进先出(FIFO)的原则。队列可以理解为一个具有两个端点的线性数据结构,其中一个端点称为"队尾"(rear),用于插入新元素,另一个端点称为"队首"(front),用于移除元素。新元素被插入到队尾,而最早插入的元素总是在队首。

队列的特点如下:

  • 元素按照插入顺序排列,最先插入的元素在队列中的位置最靠前,即队首。
  • 只能从队首移除元素,而只能在队尾插入新元素,遵循先进先出的原则。
  • 队列的长度可以动态变化,根据插入和移除操作进行调整。

队列常常用于需要按照先后顺序处理数据的场景,例如任务调度、消息传递、广度优先搜索等。

队列的基本操作包括:

  • 入队(Enqueue):将新元素插入到队尾。
  • 出队(Dequeue):移除队首的元素,并返回该元素。
  • 队列是否为空(isEmpty):判断队列是否为空。
  • 队列长度(size):返回队列中元素的个数。
  • 获取队首元素(front):返回队首元素,但不移除它。

在这里插入图片描述

队列可以通过不同的数据结构来实现,常见的实现方式包括使用数组链表

使用数组实现的队列称为顺序队列,而使用链表实现的队列称为链式队列。此外,还有循环队列,它使用数组实现,通过循环利用数组空间来提高效率。

1.2 队列的顺序存储结构

1.21 顺序队列(静态队列)

顺序队列是一种使用数组实现的队列(array-based),它是队列的一种常见实现方式。顺序队列的特点是元素按照插入顺序排列,并且只能从队首移除元素,从队尾插入新元素,遵循先进先出(FIFO)的原则。

在这里插入图片描述

顺序队列的实现依赖于一个固定大小的数组,通过数组的索引来表示队列的头部和尾部。以下是顺序队列的一些关键操作:(假设队首、队尾索引都初始化为0,这样队首索引=队首元素索引;队尾索引等于队尾元素索引+1。理解意思即可)

  1. 入队(Enqueue):将新元素插入到队尾。当有元素需要入队时,需要将其插入到数组的尾部,并更新队尾的索引。
  2. 出队(Dequeue):移除队首的元素,并返回该元素。出队操作需要将队首元素移除,并更新队首的索引。
  3. 队列是否为空(isEmpty):判断队列是否为空。当队首和队尾的索引相等时,表示队列为空
  4. 队列是否已满(isFull):判断队列是否已满。当队尾的索引达到数组的最大容量时,表示队列已满,无法插入新元素。
  5. 队列长度(size):返回队列中元素的个数。计算方法是队尾索引减去队首索引
  6. 获取队首元素(front):返回队首元素,但不移除它。可以直接通过队首索引来访问数组中的元素。
    在这里插入图片描述
  • 顺序队列的优点是实现简单、操作高效,入队和出队的时间复杂度均为O(1)。
  • 但是顺序队列的缺点是固定大小,当队列已满时无法插入新元素,且需要移动元素位置来保持队列的连续性,导致效率降低。

为了解决空间利用率低的问题,还可以使用循环队列,它使用数组实现,并通过循环利用数组空间来提高效率。循环队列的实现方式使得插入和删除操作都能在常数时间内完成,而不需要移动元素位置。

1.22 循环队列

循环队列(circular queue)是一种基于数组实现的队列数据结构,它解决了普通队列在出队操作后浪费存储空间的问题。循环队列的特点是队尾和队头可以通过取模运算实现循环移动

在这里插入图片描述

循环队列的主要特点和实现细节:

  • 使用数组实现:循环队列使用数组作为底层数据结构,通过索引来访问队列中的元素。
  • 队首和队尾指针:循环队列使用两个指针来标记队列的头部和尾部。通常使用 front 指针表示队首元素的位置,rear 指针表示队尾元素的位置。
  • 空队列判断:当 front 和 rear 指针指向同一个位置时,队列为空(也可以用一个变量实时记录队列元素个数,方便不少)。
  • 满队列判断:(rear + 1) % capacity = front 时,队列为满(capacity:数组大小)。
  • 入队操作:向循环队列中插入元素时,先判断队列是否已满。如果队列未满,将元素插入到 rear 指针指向的位置,并将 rear 指针向后移动一位(rear = (rear + 1) % capacity
  • 出队操作:从循环队列中删除元素时,先判断队列是否为空。如果队列不为空,将 front 指针向后移动一位(front = (front + 1) % capacity
  • 遍历队列:可以使用循环遍历队列中的所有元素,从 front 指针开始逐个移动并访问元素,直到 front 指针与 rear 指针相等。
    入队图示:
    在这里插入图片描述

循环队列的优点是能够更有效地利用存储空间,避免了数据迁移的开销。它适用于需要频繁进行入队和出队操作的场景,例如消息队列、任务调度等。

但是,循环队列的容量需要预先确定,并且一旦确定后就不能改变。在实现循环队列时,需要合理处理指针的移动和边界条件,确保队列操作的正确性。

1.23 优先级队列

优先级队列(priority queue)是一种特殊的队列,其中每个元素都关联有一个优先级元素的优先级决定了其在队列中的位置和顺序优先级高的元素在队列中排在前面,而优先级低的元素排在后面

相关概念和操作:

  • 元素优先级:每个元素都与一个优先级相关联,可以是数字、字符或其他可比较的类型。较高的优先级对应较高的值。
  • 插入操作:将元素插入优先级队列时,根据元素的优先级将其放置在适当的位置。通常,较高优先级的元素被放置在队列的前面,而较低优先级的元素被放置在后面
  • 删除操作:从优先级队列中删除元素时,总是删除具有最高优先级的元素。这通常是队列的第一个元素。
  • 更新操作:如果需要更改元素的优先级,可以更新元素在队列中的位置。这通常需要重新排序或调整队列的内部结构
  • 遍历操作:可以按照优先级顺序遍历优先级队列中的所有元素。这样可以按照优先级高低的顺序处理元素。
    例:下图将高优先级的元素放在队首(这里数值越小优先级越高),相同优先级则遵循先进先出规则。
    在这里插入图片描述

优先级队列常用于需要按照某种优先级顺序处理元素的场景。例如,任务调度器可以使用优先级队列来管理待执行的任务,确保高优先级任务优先执行。还可以在模拟系统中使用优先级队列来模拟事件的发生顺序。

在实现优先级队列时,可以使用各种数据结构,如链表二叉搜索树有序数组。这些数据结构提供了高效的插入、删除和查找操作,以满足优先级队列的需求。(本文使用数组实现)

在处理具有相同优先级的元素时,可以根据应用程序的需求使用先入先出(FIFO)规则或后入先出(LIFO)规则来确定元素的顺序。这决定了相同优先级的元素在队列中的相对位置。

1.3 队列的链式存储结构

链式队列是一种使用链表实现的队列数据结构。与数组队列相比,链式队列不需要预先指定固定大小,可以动态地添加和删除元素
在这里插入图片描述

主要特点和实现细节:

  • 链表结构:链式队列使用链表来存储元素。每个节点包含一个数据元素和一个指向下一个节点的指针
  • 头尾指针:链式队列维护两个指针,分别指向队列的头部和尾部节点。入队操作将新节点链接到尾部节点,并更新尾部指针。出队操作删除头部节点,并更新头部指针。
  • 空队列处理:链式队列可以处理空队列的情况,即当队列为空时,出队操作将返回一个特定的值(如NULL)或引发异常。
  • 动态大小:由于链式队列使用动态链表存储元素,它可以根据需要动态增长或缩小。这使得链式队列更加灵活,可以适应不同的元素数量和大小需求。
    在这里插入图片描述

链式队列的优点包括灵活性和动态大小,适用于处理变化的元素数量。然而,与数组队列相比,链式队列需要额外的内存来存储节点指针,并且在访问特定位置的元素时需要遍历链表,可能导致一些性能开销。

在实现链式队列时,可以定义一个节点结构来表示链表中的每个节点,并使用指针来跟踪队列的头部和尾部。通过使用指针操作,可以在常量时间内执行入队和出队操作。

在多线程环境中使用链式队列时,需要考虑线程安全性和同步问题,以避免竞态条件和数据不一致的情况。可以使用互斥锁或其他同步机制来确保线程安全性。

二、C语言实现

记得是队尾插入,队首删除。

2.1 顺序存储

2.11 顺序队列

// 顺序队列
#include <stdio.h>#define MAX_SIZE 100// 定义队列结构体
typedef struct {int data[MAX_SIZE];int front;  // 队首索引int rear;   // 队尾索引
} Queue;// 初始化队列
void initQueue(Queue *queue) {queue->front = 0;queue->rear = 0;
}// 判断队列是否为空
int isEmpty(Queue *queue) {return (queue->front == queue->rear);
}// 判断队列是否已满
int isFull(Queue *queue) {return (queue->rear == MAX_SIZE);
}// 入队
void enqueue(Queue *queue, int item) {if (isFull(queue)) {printf("队列已满,无法插入元素\n");return;}queue->data[queue->rear] = item;queue->rear++;
}// 出队
int dequeue(Queue *queue) {if (isEmpty(queue)) {printf("队列为空,无法删除元素\n");return -1;}int item = queue->data[queue->front];queue->front++;return item;
}// 获取队列长度
int getQueueLength(Queue *queue) {return queue->rear - queue->front;
}int main() {Queue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("队列长度: %d\n", getQueueLength(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("队列长度: %d\n", getQueueLength(&queue));return 0;
}

在这里插入图片描述

2.12 循环队列

// 循环队列
#include <stdio.h>#define MAX_SIZE 100// 定义循环队列结构体
typedef struct {int data[MAX_SIZE];int front;  // 队首索引int rear;   // 队尾索引int size;   // 直接用一个size来记录大小,简化空、满的判断
} CircularQueue;// 初始化循环队列
void initQueue(CircularQueue *queue) {queue->front = 0;queue->rear = 0;queue->size = 0;
}// 判断循环队列是否为空
int isEmpty(CircularQueue *queue) {return (queue->size == 0);
}// 判断循环队列是否已满
int isFull(CircularQueue *queue) {return (queue->size == MAX_SIZE);
}// 入队
void enqueue(CircularQueue *queue, int item) {if (isFull(queue)) {printf("循环队列已满,无法插入元素\n");return;}queue->data[queue->rear] = item;// 注意对队尾索引的计算,因为它是循环的 queue->rear = (queue->rear + 1) % MAX_SIZE;// 更新元素个数queue->size++;
}// 出队
int dequeue(CircularQueue *queue) {if (isEmpty(queue)) {printf("循环队列为空,无法删除元素\n");return -1;}int item = queue->data[queue->front];// 同理queue->front = (queue->front + 1) % MAX_SIZE;queue->size--;return item;
}// 获取循环队列长度
int getQueueLength(CircularQueue *queue) {return queue->size;
}int main() {CircularQueue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("循环队列长度: %d\n", getQueueLength(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("出队元素: %d\n", dequeue(&queue));printf("循环队列长度: %d\n", getQueueLength(&queue));return 0;
}

在这里插入图片描述

2.13 优先级队列

注意,优先级通常是数值越小,优先级越高。计算机领域通常都是这样的。(当然你也可以自定义)

#include <stdio.h>#define MAX_SIZE 100typedef struct {int value;int priority;
} Element;Element queue[MAX_SIZE];
int size = 0;void enqueue(int value, int priority) {if (size >= MAX_SIZE) {printf("Queue is full. Unable to enqueue.\n");return;}int i = size - 1;while (i >= 0 && queue[i].priority > priority) {queue[i + 1] = queue[i];i--;}queue[i + 1].value = value;queue[i + 1].priority = priority;size++;
}int dequeue() {if (size <= 0) {printf("Queue is empty. Unable to dequeue.\n");return -1; // Return a sentinel value indicating an error}int value = queue[0].value;for (int i = 1; i < size; i++) {queue[i - 1] = queue[i];}size--;return value;
}void traverse() {if (size <= 0) {printf("Queue is empty. Nothing to traverse.\n");return;}printf("Queue traversal: \n\t");for (int i = 0; i < size; i++) {printf("Val: %3d   Prio: %d\n\t", queue[i].value, queue[i].priority);}printf("\n");
}int main() {enqueue(5, 3);enqueue(10, 1);enqueue(3, 6);traverse();int value = dequeue();printf("Dequeued value: %d\n", value);traverse();enqueue(888, 4);printf("Enter (888,4)\n");traverse();return 0;
}

在这里插入图片描述

2.2 链式存储

// 链队  
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;typedef struct {Node* front; // 队头指针Node* rear; // 队尾指针
} Queue;Queue* createQueue() {Queue* queue = (Queue*)malloc(sizeof(Queue));queue->front = NULL;queue->rear = NULL;return queue;
}int isEmpty(Queue* queue) {return (queue->front == NULL);
}void enqueue(Queue* queue, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if (isEmpty(queue)) {queue->front = newNode;queue->rear = newNode;} else {queue->rear->next = newNode;queue->rear = newNode;}
}int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("Queue is empty. Unable to dequeue.\n");return -1; // 返回一个表示错误的特殊值}int data = queue->front->data;Node* temp = queue->front;if (queue->front == queue->rear) {queue->front = NULL;queue->rear = NULL;} else {queue->front = queue->front->next;}free(temp);return data;
}void traverse(Queue* queue) {if (isEmpty(queue)) {printf("Queue is empty. Nothing to traverse.\n");return;}printf("Queue traversal:\n\t\t");Node* current = queue->front;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {Queue* queue = createQueue();enqueue(queue, 5);enqueue(queue, 10);enqueue(queue, 3);traverse(queue);int data = dequeue(queue);printf("Dequeued data: %d\n", data);traverse(queue);return 0;
}

在这里插入图片描述



~

相关文章:

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列&#xff08;静态队列&#xff09;1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…...

【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?

上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…...

【协议】NVMe over RoCE |nvmeof

什么是nvme nvme ssd和普通ssd区别 ssd是固态硬盘&#xff0c;普通的ssd配的是SATA口&#xff08;AHCI协议&#xff09;&#xff0c;nvme ssd配的是PCIe口&#xff08;nvme传输协议&#xff09; 相比普通SSD的SATA口&#xff0c;nvme的PCIe口有巨大的性能优势。 更多详情见&…...

硬件设计电源系列文章-DCDC转换器布局设计

文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示&#xf…...

「从入门到精通,一位设计师分享学习Illustrator的技巧和经验!」

学习Illustrator的个人笔记&#xff1a;从入门到精通 Adobe Illustrator是一款广泛使用的矢量图形软件&#xff0c;用于创建各种设计作品&#xff0c;如商标、海报、名片等。在本篇博客中&#xff0c;我将分享学习Illustrator的经验和技巧&#xff0c;帮助您更好地掌握这一工具…...

RedisGraph的整体架构

The architecture of RedisGraph 本文关注RedisGraph的整体架构&#xff0c;分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构&#xff0c;最重要的就是其图存储模型&#xff0c;即其中的…...

C#可视化 家用轿车信息查询系统(具体做法及全部代码)

目录 题目&#xff1a; 效果图&#xff1a; 数据库&#xff1a; 做法&#xff1a; combobox值更新 查询按钮功能&#xff08;非空验证&#xff0c;查询数据&#xff09; datagirdview设置 全部代码&#xff1a; DBHelper类 From1主窗体代码 题目&#xff1a; 效果图&#…...

Nautilus Chain全球行分享会,上海站圆满举办

在北京时间 6 月 9 日&#xff0c;由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动&#xff0c;在上海顺利举办&#xff0c;本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz La…...

day50_mybatis

今日内容 0 复习昨日 一、分页插件 二、ORM映射【重点】 三、多表联查 【重点】 四、动态SQL 【重点】 五、$和# 零、复习昨日 mybatis orm框架,作用于持久层,高效开发,只关注sql,其他不用关心 思考MyBatis到底帮你省了哪些事情? jdbc第四步sql自己编写之外,其他mybatis都做了…...

第十一届“创业江苏”科技创业大赛正式启动

为深入实施创新驱动战略&#xff0c; 推进高水平科技自立自强&#xff0c;强化企业创新主体地位&#xff0c;加速推动创新要素向企业集聚&#xff0c;促进科技和金融深度融合&#xff0c;优化科技创新创业生态&#xff0c;吸引优秀创业团队及企业到苏州创新发展&#xff0c;根据…...

EasyX实现简易贪吃蛇

&#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f4e3;系列专栏&#xff1a;夏目的C语言宝藏 文章目录 前言一、头文件包含二、创建蛇与食物的结构体三、游戏的初始化四、游戏的绘画事件五、蛇的移动事件六、输入方向七、生成食物八、吃食物九、游戏失败的判定…...

Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)

Linux下ElasticSearch7.9.2安装配置 前言1.下载安装1.1 使用wget的方式下载1.2 官网下载 2.上传到服务器并解压3.修改es配置文件3.1 es目录简介3.2 修改配置文件 4. 创建用户并赋权5. 服务器修改配置5.1 修改文件句柄数和线程数5.2 关闭swapping5.3 修改虚拟内存 6. 启动es6.1 …...

JS 之 事件Event对象详解(属性、方法、自定义事件)

一、Event对象 1、简介 ​ 事件event对象是指在浏览器中触发事件时&#xff0c;浏览器会自动创建一个event对象&#xff0c;其中存储了本次事件相关的信息&#xff0c;包括事件类型、事件目标、触发元素等等。浏览器创建完event对象之后&#xff0c;会自动将该对象作为参数传…...

65寸电视长宽多少厘米

65寸电视的长和宽分别是多少 65寸电视机尺寸是不确定的&#xff0c;要看电视的品牌和具体型号。一般来说&#xff0c;16&#xff1a;9屏幕比例下&#xff0c;65英寸电视的长宽分别为143.90厘米和80.94厘米。电视尺寸指的是电视屏幕对角线的长度&#xff0c;目前电视尺寸普遍以英…...

Python爬取影评并进行情感分析和数据可视化

Python爬取影评并进行情感分析和数据可视化 文章目录 Python爬取影评并进行情感分析和数据可视化一、引言二、使用requestsBeautifulSoup进行影评的爬取1、分析界面元素2、编写代码 三、情感分析1、数据预处理2、情感分析3、数据可视化 一、引言 前几天出了《航海王&#xff1…...

ubuntu22.04.2安装onlyoffice(不更改默认端口版)

目录 一、配置阿里源 二、postgresql数据库 &#xff08;一&#xff09;安装postgresql &#xff08;二&#xff09;创建postgresql数据库和用户 三、安装 rabbitmq 四、安装nginx-extras 五、安装ONLYOFFICE Docs &#xff08;一&#xff09;Add GPG key &#xff08…...

企业如何有效制定企业信息化发展规划?(附信息化模板)

如何有效制定企业信息化发展规划&#xff1f;企业信息化发展规划是一个宏大而又复杂的命题&#xff0c;这篇来掰开揉碎讲一下企业应该如何有效制定信息化发展规划。 这里不给大家灌鸡汤&#xff0c;也不给大家画大饼&#xff0c;就说些实在的。 如果你想找经验方法&#xff0…...

计算机网络填空题

我会写下自己的答案和理解 希望自己可用在学习中体会到快乐&#xff0c;而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据&#xff0c;就必须遵守一些事…...

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法 【一】为什么有这个问题【二】Object类的中的hashcode方法和equals方法【三】重写hashcode【四】重写equals方法【五】hashmap中使用hashcode和equals方法 【一】为什么有这个问题 因为HashMa…...

Flutter自定义对话框返回相关问题汇总

Flutter自定义对话框返回相关问题汇总&#xff0c;详细解释 Flutter是一款流行的移动应用开发框架&#xff0c;它提供了很多内置的对话框&#xff0c;但是有时候我们需要自定义对话框来满足特定需求。在使用自定义对话框时&#xff0c;可能会遇到一些问题&#xff0c;下面是一…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...