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

队列的讲解

队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

一端进另一端出

也就是可以做到,先进先出

队列的使用场景

队列的经典应用就是保持公平性

比如:抽号机

生产者消费者模型,先来先出去,多线程的话就可能涉及到一个锁的概念

广度优先遍历(概念)

直接好友:好友

间接好友:好友的好友

可以采取队列的方式推荐

队列如何实现

数组的无法实现的因为需要一边进一边出,所以一般是单链表实现队列

同时单链表也会更加省空间

队列的实现 

创建文件

首先我们需要知道单链表实现队列的时候,我们需要有头节点和尾结点,以及链表的实际的个数,所以我们不能在结构体里面创建那麽多结构体,所以我们采取结构体的嵌套

创建栈的结构

// 链式结构:表示队列 
typedef struct QListNode
{QDataType _data;struct QListNode* _next;
}QNode;
// 队列的结构 (因为队列是先进先出,后进后出,也就是和栈是相反的,此时会尾进头出,所以我们需要更新尾部和头部节点)
// (把头结点,尾结点,链表的实际的大小放里面,这样不需要每次使用的时候进行循环找尾,我们只需要每次更新尾结点就可以)
typedef struct Queue
{QNode* _phead;//头节点QNode* _ptail;//尾结点int size;
}Queue;

这段代码定义了两个结构体,QNodeQueue,分别用于表示队列中的节点和整个队列。下面是对每个部分的详细解释:

  1. QNode 结构体:这个结构体表示队列中的单个节点。

    • _data:这是 QNode 结构体中的一个成员变量,用来存储节点中的数据。QDataType 是数据类型的别名,它应该在相关的头文件中定义,代表节点存储的数据类型。
    • _next:这是一个指向 QNode 类型的指针,用来指向同一队列中的下一个节点。如果 _next 为 NULL,表示这是队列中的最后一个节点。
  2. Queue 结构体:这个结构体表示整个队列。

    • _phead:这是一个指向 QNode 类型的指针,用来指向队列的头节点。队列的头节点是最早被加入的节点,也是下一个将要被移除的节点。
    • _ptail:这是一个指向 QNode 类型的指针,用来指向队列的尾节点。队列的尾节点是最后被加入的节点,它用于在添加新元素时更新队列。
    • size:这是一个整数类型的变量,用来存储队列中当前的元素数量。

在队列的链式表示中,不需要像顺序表示(使用数组)那样进行动态内存分配和缩容。链式结构自然地允许队列的动态增长和缩减,因为每个节点独立维护其后继节点的指针。

队列的基本操作包括:

  • 入队(Enqueue):在队尾添加一个新节点。
  • 出队(Dequeue):移除队头的节点,并返回其数据。
  • 查看队头(Peek/Front):返回队头节点的数据但不移除它。
  • 检查队列是否为空(IsEmpty):检查队列的头节点是否为 NULL

初始化与销毁队列

// 初始化队列 
void QueueInit(Queue* ps)
{ps->_phead = NULL;ps->_ptail = NULL;ps->size = 0;
}
// 销毁队列 
void QueueDestroy(Queue* ps)
{assert(ps);QNode* cur = ps->_phead;while (cur){//存下下一个节点的地址,不会出现找空的情况QNode* next = cur->_next;free(cur);cur =next;}
}
  1. QueueInit 函数

    • 这个函数接收一个指向 Queue 结构体的指针 ps
    • ps->_phead = NULL;:将队列的头节点指针设置为 NULL。这表示队列初始化时是空的,没有任何元素。
    • ps->_ptail = NULL;:将队列的尾节点指针也设置为 NULL。由于队列是空的,头尾节点都不存在。
    • ps->size = 0;:设置队列中元素的数量为0。
  2. QueueDestroy 函数

    • 这个函数同样接收一个指向 Queue 结构体的指针 ps
    • assert(ps);:使用 assert 宏来确保传入的 ps 不是 NULL。如果 ps 是 NULLassert 将触发断言失败,这有助于避免对空指针的无效操作。
    • QNode* cur = ps->_phead;:声明一个 QNode 类型的指针 cur 并初始化为队列的头节点。
    • while (cur):使用 while 循环来遍历队列,直到 cur 为 NULL,即队列中的所有节点都被处理完毕。
    • QNode* next = cur->_next;:在释放当前节点之前,先保存下一个节点的地址,以便在释放当前节点后能够继续遍历队列。
    • free(cur);:使用 free 函数释放当前节点 cur 所占用的内存。
    • cur = next;:将 cur 更新为下一个节点,继续循环直到所有节点都被释放。
    • 循环结束后,队列中的所有节点都被释放,此时队列被销毁。

队尾入队列 

// 队尾入队列 
void QueuePush(Queue* ps, QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("QueuePush:newnode:error:");exit(1);}//把需要插入的数值插入到节点里面newnode->_next = NULL;newnode->_data = x;// ps->_phead == ps->_ptail 的结果确实是 true,这表明队列中只有一个元素(头尾相接)。// 但是,通常情况下,我们不会使用 ps->_phead == ps->_ptail // 来检查队列中是否只有一个元素。相反,我们通常会使用 ps->size == 1 或者 ps->_phead != NULL && ps->_ptail != NULL // 来检查队列中是否只有一个元素。//插入节点 第一个节点,这里的判断是不能写成ps->_phead ==ps->_ptail;因为都是空指针不能进行比较//ps->_phead == NULLif (ps->size == 0){ps->_phead = ps->_ptail = newnode;}else{//尾插节点ps->_ptail->_next = newnode;ps->_ptail= newnode;}ps->size++;
}

这段代码定义了一个名为 QueuePush 的函数,用于在队列的尾部添加一个新的元素。

  1. void QueuePush(Queue* ps, QDataType x):函数定义开始,QueuePush 接收一个指向 Queue 结构体的指针 ps 和一个要入队的新数据 x

  2. QNode* newnode = (QNode*)malloc(sizeof(QNode));:使用 malloc 函数为新节点分配内存。newnode 是指向新分配内存的指针。

  3. if (newnode == NULL):检查 malloc 是否成功分配了内存。如果 newnodeNULL,表示内存分配失败。

  4. perror("QueuePush:newnode:error:");:如果内存分配失败,使用 perror 函数输出错误信息。

  5. exit(1);:如果内存分配失败,调用 exit 函数以非零状态码退出程序。

  6. newnode->_next = NULL;:将新节点的 _next 指针设置为 NULL。这是新节点的尾部标识,表示在新节点之后没有更多的节点。

  7. newnode->_data = x;:将新数据 x 存储在新节点的 _data 成员中。

  8. if (ps->size == 0):检查队列是否为空(即队列中的元素数量为0)。

  9. ps->_phead = ps->_ptail = newnode;:如果是空队列,那么新节点同时是头节点和尾节点。因此,将头节点和尾节点指针都指向 newnode

  10. else:如果队列不是空的,执行以下操作:

    • ps->_ptail->_next = newnode;:将当前尾节点的 _next 指针指向新节点,从而将新节点添加到队列的末尾。
    • ps->_ptail = newnode;:更新尾节点指针,使其指向新节点。
  11. ps->size++;:队列中元素的数量增加1。

这段代码实现了队列的尾部入队操作。它首先检查队列是否为空,然后相应地将新节点添加到队列的末尾,并更新尾节点指针和队列的元素数量。如果内存分配失败,程序将输出错误信息并退出。

队头出队列 

// 队头出队列 
void QueuePop(Queue* ps)
{assert(ps && ps->size);// 改变头结点ps->_phead = ps->_phead->_next;ps->size--;
}

这段代码定义了一个名为 QueuePop 的函数,其目的是从队列头部移除一个元素。

  1. #include"Queue.h":这行代码应该位于文件的顶部,用于引入包含 Queue 结构体和 QNode 结构体定义以及 QDataType 类型定义的头文件。

  2. void QueuePop(Queue* ps):函数定义开始,QueuePop 接收一个指向 Queue 结构体的指针 ps 作为参数。

  3. assert(ps && ps->size);assert 是一个宏,用于在运行时测试一个条件是否为真。如果条件为假,则 assert 将产生一个断言失败,通常会导致程序异常终止。在这里,它用于确保传入的队列指针 ps 不是 NULL,并且队列中至少有一个元素(即 ps->size 大于0)。

  4. ps->_phead = ps->_phead->_next;:这行代码将队列的头节点指针 _phead 更新为指向下一个节点,从而移除当前队列头部的节点。由于队列是先进先出(FIFO)的数据结构,队头节点是将要被移除的节点。

  5. ps->size--;:队列中元素的数量减少1。

这段代码实现了队列的头部出队操作。它首先通过 assert 检查队列是否非空,然后将头节点指针移动到下一个节点,以此出队操作,最后更新队列的元素数量。

获取队列头部元素

// 获取队列头部元素 
QDataType QueueFront(Queue* ps)
{assert(ps && ps->size);return ps->_phead->_data;
}
  1. QueueFront 函数

    • 这个函数接收一个指向 Queue 结构体的指针 ps
    • assert(ps && ps->size);:使用 assert 宏确保传入的队列指针 ps 不是 NULL,并且队列中至少有一个元素(即 ps->size 大于0)。
    • return ps->_phead->_data;:返回队列头部节点的 _data 成员。由于队列是先进先出(FIFO)的数据结构,队头节点的 _data 成员包含了最早被加入的元素的值。

获取队列队尾元素 

// 获取队列队尾元素 
QDataType QueueBack(Queue* ps)
{assert(ps && ps->size);return ps->_ptail->_data;
}
  1. QueueBack 函数

    • 这个函数同样接收一个指向 Queue 结构体的指针 ps
    • assert(ps && ps->size);:使用 assert 宏确保传入的队列指针 ps 不是 NULL,并且队列中至少有一个元素。
    • return ps->_ptail->_data;:返回队列尾部节点的 _data 成员。在链式队列中,尾部节点是最后一个被加入的节点,其 _data 成员包含了最近一个被加入的元素的值。

获取队列中有效元素个数

// 获取队列中有效元素个数 
int QueueSize(Queue* ps)
{return ps->size;
}
  1. QueueSize 函数

    • 这个函数接收一个指向 Queue 结构体的指针 ps
    • return ps->size;:返回队列中有效元素的个数,即 size 成员的值。

检测队列是否为空,如果为空返回非零结果,如果非空返回0 

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* ps)
{assert(ps);return ps->size == 0;
}

QueueEmpty 函数

  • 这个函数接收一个指向 Queue 结构体的指针 ps
  • assert(ps);:使用 assert 宏确保传入的队列指针 ps 不是 NULL
  • return ps->size == 0;:检查队列是否为空。如果 size 成员的值等于0,则表示队列为空,函数返回非零值(在C语言中,非零值被视为“真”),否则返回0(“假”)

 队列代码的总结 

Queue.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int QDataType;
// 链式结构:表示队列 
typedef struct QListNode
{QDataType _data;struct QListNode* _next;
}QNode;
// 队列的结构 (因为队列是先进先出,后进后出,也就是和栈是相反的,此时会尾进头出,所以我们需要更新尾部和头部节点)
// (把头结点,尾结点,链表的实际的大小放里面,这样不需要每次使用的时候进行循环找尾,我们只需要每次更新尾结点就可以)
typedef struct Queue
{QNode* _phead;//头节点QNode* _ptail;//尾结点int size;
}Queue;
// 这里采取一级指针进行实现代码逻辑,如果不创建队列的结构,我们就需要采取二级指针
// 初始化队列 
void QueueInit(Queue* ps);
// 销毁队列 
void QueueDestroy(Queue* ps);
// 队尾入队列 
void QueuePush(Queue* ps, QDataType data);
// 队头出队列 
void QueuePop(Queue* ps);
// 获取队列头部元素 
QDataType QueueFront(Queue* ps);
// 获取队列队尾元素 
QDataType QueueBack(Queue* ps);
// 获取队列中有效元素个数 
int QueueSize(Queue* ps);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* ps);

Queue.c

#include"Queue.h"
// 初始化队列 
void QueueInit(Queue* ps)
{ps->_phead = NULL;ps->_ptail = NULL;ps->size = 0;
}
// 销毁队列 
void QueueDestroy(Queue* ps)
{assert(ps);QNode* cur = ps->_phead;while (cur){//存下下一个节点的地址,不会出现找空的情况QNode* next = cur->_next;free(cur);cur =next;}
}
// 队尾入队列 
void QueuePush(Queue* ps, QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("QueuePush:newnode:error:");exit(1);}//把需要插入的数值插入到节点里面newnode->_next = NULL;newnode->_data = x;// ps->_phead == ps->_ptail 的结果确实是 true,这表明队列中只有一个元素(头尾相接)。// 但是,通常情况下,我们不会使用 ps->_phead == ps->_ptail // 来检查队列中是否只有一个元素。相反,我们通常会使用 ps->size == 1 或者 ps->_phead != NULL && ps->_ptail != NULL // 来检查队列中是否只有一个元素。//插入节点 第一个节点,这里的判断是不能写成ps->_phead ==ps->_ptail;因为都是空指针不能进行比较//ps->_phead == NULLif (ps->size == 0){ps->_phead = ps->_ptail = newnode;}else{//尾插节点ps->_ptail->_next = newnode;ps->_ptail= newnode;}ps->size++;
}
// 队头出队列 
void QueuePop(Queue* ps)
{assert(ps && ps->size);// 改变头结点ps->_phead = ps->_phead->_next;ps->size--;
}
// 获取队列头部元素 
QDataType QueueFront(Queue* ps)
{assert(ps && ps->size);return ps->_phead->_data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* ps)
{assert(ps && ps->size);return ps->_ptail->_data;
}
// 获取队列中有效元素个数 
int QueueSize(Queue* ps)
{return ps->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* ps)
{assert(ps);return ps->size == 0;
}

相关文章:

队列的讲解

队列的概念 队列:只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 一端进另一端出 也就是可以做到&#xff0c;先…...

算法学习笔记(LCA)

L C A LCA LCA&#xff1a;树上两个点的最近公共祖先。&#xff08;两个节点所有公共祖先中&#xff0c;深度最大的公共祖先&#xff09; L C A LCA LCA的性质&#xff1a; 在所有公共祖先中&#xff0c; L C A ( x , y ) LCA(x,y) LCA(x,y)到 x x x和 y y y的距离都最短。 x …...

记一次苹果appstore提审拒审问题1.2

有关苹果appstore审核1.2问题的处理方案 2023.8.6苹果回复 Bug Fix Submissions The issues weve identified below are eligible to be resolved on your next update. If this submission includes bug fixes and youd like to have it approved at this time, reply to thi…...

在做题中学习(59):除自身以为数组的乘积

238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前缀积和后缀积 思路&#xff1a;answer中的每一个元素都是除自己以外所有元素的和。那就处理一个前缀积数组和后缀积数组。 而前缀积(f[i])是&#xff1a;[0,i-1]所有元素的乘积 后缀…...

centos 把nginx更新到最新版本

yum install epel-release # 添加 EPEL 软件仓库&#xff0c;这是 Nginx 官方软件仓库的依赖项 yum install yum-utils # yum-utils 包含了 yum-config-manager 工具&#xff0c;它可以让您轻松地启用、禁用或配置 yum 软件仓库 vi /etc/yum.repos.d/nginx.repo # 增加以下内容…...

01.认识HTML及常用标签

目录 URL&#xff08;统一资源定位系统&#xff09; HTML&#xff08;超文本标记语言&#xff09; 1&#xff09;html标签 2&#xff09;head标签 3&#xff09;title标签 4&#xff09;body标签 标签的分类 DTD文档声明 基础标签 1&#xff09;H系列标签 2&#xff09…...

从零开始:C++ String类的模拟实现

文章目录 引言1.类的基本结构2.构造函数和析构函数3.基本成员函数总结 引言 在C编程中&#xff0c;字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能&#xff0c;使得字符串处理变得相对简单。然而&#xff0c;对于学习C的开发者来说&#x…...

银河麒麟服务器操作系统V10-SP2部署gitlab服务

安装依赖 yum -y install python3-policycoreutils openssh-server openssh-clients postfix cronie curl下载gitlab-ce-15.4.2-ce.0.el8.x86_64.rpm安装包。 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.4.2-ce.0…...

【计算机毕业设计】基于SSM+Vue的线上旅行信息管理系统【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 设计原则 1.3 论文组织结构 2 系统关键技术 2.1JSP技术 2.2 JAVA技术 2.3 B/S结构 2.4 MYSQL数据库 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3 经济可行性 3.1.4 法律可行性 3.2系统功能分析 3.2.1管理员功能分析 3.2.…...

链表CPP简单示例

链表创建 链表打印全部内容 获取链表长度 链表根据指定位置添加元素 链表根据指定位置删除元素 #include <iostream> using namespace std;// 1、创建结构体// typedef 经常在结构中使用 typedef 别名 typedef struct node {int date;struct node* next; // 必须要自己…...

智能EDM邮件群发工具哪个好?

企业之间的竞争日益激烈&#xff0c;如何高效、精准地触达目标客户&#xff0c;成为每个市场战略家必须面对的挑战。在此背景下&#xff0c;云衔科技凭借其前沿的AI技术和深厚的行业洞察&#xff0c;匠心推出了全方位一站式智能EDM邮件营销服务平台&#xff0c;重新定义了邮件营…...

低代码与AI技术发展:开启数字化新时代

随着数字化转型的深入推进&#xff0c;低代码和AI技术逐渐成为各行各业关注的焦点。这两种技术的发展不仅改变了传统开发模式&#xff0c;还为企业创新和产业升级提供了新契机。本文将探讨这两种技术在实际应用中的相互促进作用&#xff0c;以及它们为我国经济社会发展带来的机…...

风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码) 基于遗传算法优化BP神经网络是一种常见的方法,用于改进BP神经网络在风电功率预测中的性…...

uni-segmented-control插件使用

dcloud插件市场 前端/uniapp 1.HBuildX打开目标项目 2.进入dcloud插件市场下载目标插件 3.看到如下提示(已经可以在目标项目中使用插件啦) 4.项目正式使用...

被动防护不如主动出击

自网络的诞生以来&#xff0c;攻击威胁事件不断涌现&#xff0c;网络攻防对抗已然成为信息时代背景下的一场无硝烟的战争。然而&#xff0c;传统的网络防御技术&#xff0c;如防火墙和入侵检测技术&#xff0c;往往局限于一种被动的敌暗我明的防御模式&#xff0c;面对攻击者无…...

ollama离线部署llama3(window系统)

首先介绍下ollama是什么&#xff1f;Ollama是一个开源的大型语言模型服务工具&#xff0c;旨在为用户提供本地化的运行环境&#xff0c;满足个性化的需求。具体来说&#xff0c;Ollama是一个功能强大的开源框架&#xff0c;可以简化在Docker容器中部署和管理大型语言模型&a…...

基于Django实现的(bert)深度学习文本相似度检测系统设计

基于Django实现的&#xff08;bert&#xff09;深度学习文本相似度检测系统设计 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录页面 注册页面&#xff1a;用户账号&#xff0c;密码…...

数据中心网络随想-电路交换

数据中心网络扩容并不容易&#xff0c;涉及设备上架&#xff0c;切换等又硬又大的动作&#xff0c;期间对所有应用都会产生影响&#xff0c;所以理论上 “加钱加硬件” 这种看起来很简单的事实际上真不如 “写一个随时部署升级的端到端拥塞控制算法” 更容易实施。 傍晚绕小区…...

并行执行线程资源管理方式——《OceanBase 并行执行》系列 3

在某些特定场景下&#xff0c;由于需要等待线程资源&#xff0c;并行查询会遇到排队等待的情况。本篇博客将介绍如何管理并行执行线程资源&#xff0c;以解决这种问题。 《OceanBase并行执行》系列的内容分为七篇博客&#xff0c;本篇是其中的第三篇。 一并行执行概念二如何手…...

数据库系统概论(个人笔记)(第二部分)

数据库系统概论&#xff08;个人笔记&#xff09; 文章目录 数据库系统概论&#xff08;个人笔记&#xff09;2、关系模型简介2.1 关系数据库的结构2.2 数据库模式2.3 键2.4 模式图2.5 关系查询语言2.6 关系代数 2、关系模型简介 2.1 关系数据库的结构 Structure of Relational…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...