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

数据结构与算法——栈和队列

栈和队列

    • 概念与结构
    • 栈的实现
      • 栈的初始化
      • 栈的销毁
      • 判断栈是否为空
      • 入栈
      • 出栈
      • 取栈顶元素
      • 栈中有效元素个数
  • 队列
    • 概念与结构
    • 队列的实现
      • 队列结点结构
      • 队列结构
      • 初始化队列
      • 队列判空
      • 销毁队列
      • 入队列,队尾
      • 出队列,队头
      • 取队头数据
      • 取队尾数据
      • 队列有效数据个数

概念与结构

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出的原则。(先进的后出,后进的先出)

压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈的底层结构选型:链表 or 数组?
  • 使用链表来说,栈顶是经常操作的一端,为了降低时间复杂度,将链表的头看作栈顶,尾看作栈底,入栈的时间复杂度则为O(1),出栈时间复杂度O(1)。

  • 使用数组来说,尾部看作栈顶,头部看作栈顶,入栈、出栈时间复杂度为O(1)。

他们的入栈、出栈操作时间复杂度都一样,但是我们选择数组更好,因为链表是独立的结点,每次操作都要申请一个新的结点,8个字节,空间的消耗更大,所以底层选择数组。所以物理、逻辑结构都是是线性的。

栈的实现

栈的初始化

首先定义栈的结构,然后定义一个初始化函数,因为对形参的改变需要影响实参,所以传址调用,且在函数中用一级指针接收。

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义栈的结构
typedef int StackDataType;
typedef struct Stack {StackDataType* arr;int top;     //指向栈顶的位置int capacity;//栈的容量
}Stack;//初始化
void StcakInit(Stack* ps);//形参的变化要影响实参,所以要传传址,用一级指针接受

实现文件

#include"Stack.h"//初始化
void StcakInit(Stack* ps) //ps是形参,形参的初始化要改变实参,所以传址
{ps->arr = NULL;ps->top = ps->capacity = 0;
}

测试文件

#include"Stack.h"void test01()
{Stack st;StackInit(&st);//传址,st是实参
}int main()
{test01();return 0;
}

栈的销毁

//销毁栈
void StackDestroy(Stack* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}

判断栈是否为空

bool 函数是一种返回 布尔值(true 或 false) 的函数,通常用于逻辑判断。在 C 语言中,bool 类型需要包含 <stdbool.h> 头文件才能使用。
检查栈是否为空:

  • 如果 ps->top == 0(栈空),返回 true。

  • 否则返回 false。

//判断栈是否为空
bool StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0; //如果 top == 0,返回 true(栈空);否则返回 false
}

入栈

定义一个入栈的函数,一个保存结构体地址的指针变量,一个需要插入的数据,因为进行了初始化,所以要进行增容,这里需要使用realloc(指向之前分配的内存块的指针,新的内存块大小(字节数)),然后将新增容的空间和重新分配内存块的大小赋值给原来的capacity和arr。

//插入数据-栈顶入数据
void StackPush(Stack* ps, StackDataType x)
{assert(ps);if (ps->top == ps->capacity){//增容int newCapacity = ps->capacity = 0 ? 4 : 2 * ps->capacity;StackDataType * tmp = (StackDataType*)realloc(ps->arr, newCapacity * sizeof(StackDataType));if (tmp == NULL){perror("relloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->top++] = x;
}

出栈

因为栈为空返回的是true,所以这里要取反

//出栈-后进的先出,先进的后出
void StackPop(Stack* ps)
{assert(!StackEmpty(ps));--ps->top;
}

取栈顶元素

不同于出栈的是不会减少栈中的元素个数

//取栈顶元素
StackDataType* StcakTop(Stack* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}

栈中有效元素个数

int StackSize(ST* ps)
{return ps->top;
}

队列

概念与结构

概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)

⼊队列:进⾏插⼊操作的⼀端称为队尾
出队列:进⾏删除操作的⼀端称为队头

在这里插入图片描述
队列的底层结构如何选型?

数组:选择最后为队尾时->入队O(1),出队O(N)    选择第一个数据为队尾时->入队O(N),出队O(1)
链表:单链表时,第一个结点为队头,尾结点为队尾时,入队O(N)(因为需要找尾结点),出队O(1)双向链表时,这时入队,出队的时间复杂度都为O(1),但是每个结点的空间消耗的太大。

优化单链表:在定义第一个结点的指针为phead的基础上,定义尾结点的指针为ptail,入队时候直接再ptail后面插入结点,这样也入队,出队时间复杂度都为O(1)。

队列的实现

队列结点结构

typedef int QNDataType;//队列结点的结构
typedef struct QueueNode {QNDataType data;struct QueueNode* next;
}QNode;

队列结构

//队列的结构
typedef struct Queue {QNode* phead;QNode* ptail;
}Q;

初始化队列

//队列的初始化
void QueueInit(Q* pq)
{assert(pq);pq->phead = pq->ptail = NULL;
}

队列判空

//判空
bool QueueEmpty(Q* pq)
{assert(pq);return pq->phead == NULL;
}

销毁队列

pcur从头开始遍历(条件:pcur不为空),然后将pcur的下一个结点存起来。释放pcur,将存起来的结点赋给pcur,最后手动将phead和ptail置空。

//销毁队列
void QueueDestroy(Q* pq)
{assert(pq);QNode* pcur = pq->phead;while(pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;//pq->size = 0;
}

入队列,队尾

队列不为空:pq->ptail->next = newnode,然后将pq->ptail = pq->ptail->next
在这里插入图片描述
为空的时候:
phead = ptail = newnode

//队尾入数据
void QueuePush(Q* pq, QNDataType x)
{assert(pq);//申请结点空间QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;//队列为空if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else {pq->ptail->next = newnode;}pq->ptail = newnode;
}

出队列,队头

先将phead->next保存下来,然后释放phead,然后phead = phead->next ,只有一个结点(头,尾都指向同一个节点)phead和ptail都需要置空
在这里插入图片描述

//队头出数据
void QueuePop(Q* pq)
{//判空assert(!QueueEmpty(pq));//只有一个结点if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else {QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}
}

取队头数据

//取队头数据
QNDataType QueueFront(Q* pq)
{assert(!QueueEmpty(pq));return pq->phead->data;
}

取队尾数据

//取队尾数据
QNDataType QueueBack(Q* pq)
{assert(!QueueEmpty(pq));return pq->ptail->data;
}

队列有效数据个数

第一种方式:遍历链表——适用于不会频繁调用队列有效数据个数的场景

//队列有效元素个数
int QueueSize(Q* pq)
{assert(pq);//第一种方式:遍历链表——适用于不会频繁调用队列有效数据个数的场景QNode* pcur = pq->phead;int size = 0;while (pcur){size++;pcur = pcur->next;}return size;}

第二种方式:遍历链表——适用于频繁调用队列有效数据个数的场景(完整代码)
//return pq->size;

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int QNDataType;typedef struct QueueNode {QNDataType data;struct QueueNode* next;
} QNode;typedef struct Queue {QNode* phead;QNode* ptail;int size;  // 新增:记录队列元素个数
} Q;void QueueInit(Q* pq);
bool QueueEmpty(const Q* pq);
void QueuePush(Q* pq, QNDataType x);
void QueuePop(Q* pq);
QNDataType QueueFront(const Q* pq);
QNDataType QueueBack(const Q* pq);
int QueueSize(Q* pq);  // 新增:O(1) 方式
void QueueDestroy(Q* pq);
#include "Queue.h"void QueueInit(Q* pq) {assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}bool QueueEmpty(const Q* pq) {assert(pq);return pq->size == 0;  // 直接判断 size
}void QueuePush(Q* pq, QNDataType x) {assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL) {perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL) {pq->phead = pq->ptail = newnode;} else {pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;  // 更新 size
}void QueuePop(Q* pq) {assert(!QueueEmpty(pq));QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL) {pq->ptail = NULL;}pq->size--;  // 更新 size
}QNDataType QueueFront(const Q* pq) {assert(!QueueEmpty(pq));return pq->phead->data;
}QNDataType QueueBack(const Q* pq) {assert(!QueueEmpty(pq));return pq->ptail->data;
}int QueueSize(Q* pq) {assert(pq);return pq->size;  // O(1) 直接返回
}void QueueDestroy(Q* pq) {assert(pq);QNode* pcur = pq->phead;while (pcur) {QNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;  // 重置 size
}

相关文章:

数据结构与算法——栈和队列

栈和队列 栈概念与结构栈的实现栈的初始化栈的销毁判断栈是否为空入栈出栈取栈顶元素栈中有效元素个数 队列概念与结构队列的实现队列结点结构队列结构初始化队列队列判空销毁队列入队列&#xff0c;队尾出队列&#xff0c;队头取队头数据取队尾数据队列有效数据个数 栈 概念与…...

新电脑软件配置三 pycharm

快捷键放大和缩小字体 按住ctrl鼠标滚轮向上 缩小同理...

浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)

JavaScript&#xff08;ECMAScript&#xff09;的发展经历了多个版本&#xff0c;每个版本都引入了新特性和改进。以下仅是对三个常用版本&#xff08;ES5、ES6&#xff08;ES2015&#xff09; 和 ES2023&#xff09;的基本对比及使用建议&#xff1a; 目前常见项目中还是用ES6…...

【Odoo】Pycharm导入运行Odoo15

【Odoo】Pycharm导入运行Odoo15 前置准备1. Odoo-15项目下载解压2. PsrtgreSQL数据库 项目导入运行1. 项目导入2. 设置项目内虚拟环境3. 下载项目中依赖4. 修改配置文件odoo.conf 运行Pycharm快捷运行 前置准备 1. Odoo-15项目下载解压 将下载好的项目解压到开发目录下 2. …...

【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案

WPF手机号码归属地批量查询与分类导出方案 应用场景 ​​市场营销​​&#xff1a;企业根据手机号码归属地进行精准营销&#xff0c;按城市或省份分类制定针对性推广策略​​客户管理​​&#xff1a;快速对客户手机号码进行归属地分类&#xff0c;便于后续客户关系管理​​数…...

中级统计师-统计学基础知识-第四章 假设检验

一、假设检验的基本原理 1. 基本思想 反证法&#xff1a;假设原假设成立&#xff0c;通过样本矛盾性进行反驳小概率原理&#xff1a;设定显著性水平 α \alpha α&#xff08;通常取 0.05&#xff09;&#xff0c;若观测结果的概率 p ≤ α p \leq \alpha p≤α&#xff0c…...

等于和绝对等于的区别

1. &#xff08;等于&#xff09; 特点&#xff1a;比较时会自动进行类型转换&#xff08;隐式转换&#xff09;&#xff0c;尝试将两边的值转为相同类型后再比较。规则&#xff1a; 如果类型相同&#xff0c;直接比较值。如果类型不同&#xff0c;按以下规则转换&#xff1a; …...

家庭关系处理个人总结

首先要说到前面的是&#xff0c;每个家庭的成员背景环境经济状况不同&#xff0c;原生家庭差异&#xff0c;导致面临具体问题是不同的。就类似软件“没有银弹”的概念&#xff0c;没有一种方法可以解决每个人问题。 举个例子&#xff0c;面对婆媳矛盾 网上父辈的人 会说 百行孝…...

【Python训练营打卡】day29 @浙大疏锦行

DAY 29 复习日 知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解&#xff1a;外部修改、动态 3. 类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;…...

React 19版本refs也支持清理函数了。

文章目录 前言一、refs 支持清理函数二、案例演示1.useEffect写法2.React 19改进 的ref写法 总结 前言 React 19版本发布了ref支持清理函数了&#xff0c;这样就可以达到useEffect一样的效果了。为啥需要清理函数呢&#xff0c;这是因为节约内存。 清理事件监听&#xff08;避…...

uniapp的适配方式

文章目录 前言✅ 一、核心适配方式对比&#x1f4cf; 二、rpx 单位&#xff1a;uni-app 的核心适配机制&#x1f9f1; 三、默认设计稿适配&#xff08;750宽&#xff09;&#x1f501; 四、字体 & 屏幕密度适配&#x1f6e0; 五、特殊平台适配&#xff08;底部安全区、刘海…...

Java面试场景:从音视频到AI应用的技术探讨

面试场景&#xff1a;音视频与AI应用技术的碰撞 在某互联网大厂的面试中&#xff0c;面试官王先生与求职者明哥展开了一场关于音视频技术与AI应用的对话。 第一轮提问&#xff1a;音视频场景 面试官&#xff1a;明哥&#xff0c;你能谈谈在音视频场景中&#xff0c;Spring B…...

es聚合-词条统计

es语句 ---普通结构----"tags":{"type": "keyword","index": true},GET /knowledge_test/_search {"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags",&quo…...

【沉浸式求职学习day43】【Java面试题精选3】

沉浸式求职学习 1.Java中this和super的区别2.为什么返回类型不算方法重载3.方法重写时需要注意什么问题4.深克隆和浅克隆有什么区别5.如何实现深克隆6.什么是动态代理7.静态代理和动态代理的区别8.如何实现动态代理&#xff1f;9.JDK Proxy 和 CGLib 有什么区别&#xff1f;10.…...

OpenAI推出Codex — ChatGPT内置的软件工程Agents

OpenAI继续让ChatGPT对开发者更加实用。 几天前,他们增加了连接GitHub仓库的支持,可以"Deep Research"并根据你自己的代码提问。 今天,该公司在ChatGPT中推出了Codex的研究预览版,这是迄今为止最强大的AI编码Agent。 它可以编写代码、修复错误、运行测试,并在…...

Win 11开始菜单图标变成白色怎么办?

在使用windows 11的过程中&#xff0c;有时候开始菜单的某些程序图标变成白色的文件形式&#xff0c;但是程序可以正常打开&#xff0c;这个如何解决呢&#xff1f; 这通常是由于快捷方式出了问题&#xff0c;下面跟着操作步骤来解决吧。 1、右键有问题的软件&#xff0c;打开…...

中级统计师-统计学基础知识-第三章 参数估计

统计学基础知识 第三章 参数估计 第一节 统计量与抽样分布 1.1 总体参数与统计量 总体参数&#xff1a;描述总体特征的未知量&#xff08;如均值 μ \mu μ、方差 σ 2 \sigma^2 σ2、比例 π \pi π&#xff09;。统计量&#xff1a;由样本数据计算的量&#xff08;如样本…...

学习黑客HTTP 请求头

HTTP 请求头&#xff08;Request Headers&#xff09;是 HTTP 请求中非常重要的一部分&#xff0c;它们以键值对的形式向服务器传递关于请求的附加信息、客户端的能力或上下文。 理解请求头对于 Web 开发、API 交互、网络调试和安全都至关重要。下面我将常见的 HTTP 请求头字段…...

日志参数含义

一 学习率相关 base_lr&#xff1a;基础学习率&#xff0c;初始设定的学习率 -lr&#xff1a;当前实际使用的学习率&#xff0c;通常是 base_lr 经过学习率调整策略后的值&#xff0c;比如lrbase_lr*(1start_factor) 时间统计 time&#xff1a;每次迭代总时间&#xff0c;单位…...

[Linux]安装吧!我的软件包管理器!

一、常见安装方式 在 Linux 中&#xff0c;有 3 种常见的软件安装方式&#xff1a; &#xff08;1&#xff09;yam、apt &#xff08;2&#xff09;.rpm 安装包安装 &#xff08;3&#xff09;源码安装 二、什么是软件包 在 Linux 下安装软件&#xff0c;通常的办法是下载…...

Flink 作业提交流程

Apache Flink 的 作业提交流程&#xff08;Job Submission Process&#xff09; 是指从用户编写完 Flink 应用程序&#xff0c;到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互&#xff0c;包括客户端、JobManager、TaskManager 和 ResourceManager。…...

牛客网NC276110题解:小红的数组重排

牛客网NC276110题解&#xff1a;小红的数组重排 题目解析 算法思路 对数组进行排序&#xff08;非降序&#xff09;检查特殊情况&#xff1a; 如果存在三个连续相等的元素&#xff0c;则无解如果前两个元素都是0&#xff0c;则无解 若不存在特殊情况&#xff0c;则排序后的数…...

从零启动 Elasticsearch

elastic 有弹力的 ElaticSearch &#xff08;ES&#xff09;是一个基于 Lucene 的分布式全文检索引擎。可以做到近乎实时地存储、检索数据&#xff0c;并且本身具有良好的扩展性&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别&#xff08;1 Petabyte 1024TB&…...

nginx服务器实验

1.实验要求 1&#xff09;在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2&#xff09;为nginx服务配置虚拟主机&#xff0c;新增两个域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…...

王树森推荐系统公开课 排序02:Multi-gate Mixture-of-Experts (MMoE)

专家模型 与上一节相同&#xff0c;模型的输入是一个向量&#xff0c;包含用户特征、物品特征、统计特征、场景特征&#xff0c;把向量输入三个神经网络&#xff0c;三个神经网络都是由很多全连接层组成&#xff0c;但是并不共享参数&#xff0c;三个神经网络各输出一个向量&a…...

【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理

目录 一、图像几何变化 1、对图片进行放大、缩小、水平放大和垂直放大 2、旋转、缩放、控制画布大小 二、图像形态学处理 1、梯度运算 2、闭运算 3、礼帽运算 4、黑帽运算 三、图像阈值分割 1、二值化处理 2、反二值化处理 3、截断阈值处理 4、超阈值零处理 5、低…...

代码随想录算法训练营 Day49 图论Ⅰ 深度优先与广度优先

图论 基础 图的概念 图的概念 概念清单有向图 (a)无向图 (b)有向/无向如图 a 所示每条边有指向如图 b 所示每条边没有箭头指向权值每条边的权值每条边的权值度-有几条边连到该节点 (eg V 2 V_2 V2​ 度为 3)入度/出度出度&#xff1a;从该节点出发的边个数入度&#xff1a;…...

LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 次修改 ( l , r , v ) (l,r,v) (l,r,v)&#xff1a; 对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r]&#xff0c;令 a i ← a i v a_i\gets a_iv ai​←…...

PyTorch音频处理技术及应用研究:从特征提取到相似度分析

文章目录 音频处理技术及应用音频处理技术音视频摘要技术音频识别及应用 梅尔频率倒谱系数音频特征尔频率倒谱系数简介及参数提取过程音频处理快速傅里叶变换(FFT)能量谱处理离散余弦转换 练习案例&#xff1a;音频建模加载音频数据源波形变换的类型绘制波形频谱图波形Mu-Law 编…...

【IPMV】图像处理与机器视觉:Lec10 Edges and Lines

【IPMV】图像处理与机器视觉&#xff1a;Lec10 Edges and Lines 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid …...

Elasticsearch 初步认识

Elasticsearch 初步认识 1 索引&#xff08;index&#xff09; 索引是具有相同结构的文档集合。例如&#xff0c;可以有一个客户信息的索引&#xff0c;包括一个产品目录的索引&#xff0c;一个订单数据的索引。在系统上索引的名字全部小写&#xff0c;通过这个名字可以用来执…...

数据库DDL

数据库DDL&#xff08;数据定义语言&#xff09;全面解析 一、DDL定义 DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;是SQL语言的一个子集&#xff0c;专门用于定义和管理数据库结构。它允许数据库管理员和开发人员创建、修改和删除数据库对象…...

企业级小程序APP用户数据查询系统安全脆弱性分析及纵深防御体系构建

一、用户数据查询系统安全现状分析 1.1 业务场景风险建模 在企业小程序用户数据查询业务中&#xff0c;普遍存在以下安全风险点&#xff1a; ①输入验证缺失&#xff1a;未对姓名、身份证号等关键输入进行严格的格式校验与合法性检查 ②身份认证薄弱&#xff1a;仅依赖基础参数…...

互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖

场景描述 在某互联网大厂的面试会议室里&#xff0c;严肃的面试官老王正审视着面前的程序员明哥。这场面试以业务场景为切入点&#xff0c;围绕Java技术栈展开。 第一轮&#xff1a;基础知识与Spring生态 面试官老王&#xff1a; 明哥&#xff0c;你对Spring Boot的核心功能…...

23种设计模式解释+记忆

一、创建型模式&#xff08;5种&#xff09;—— “怎么造对象&#xff1f;” 单例模式&#xff08;Singleton&#xff09; 场景&#xff1a;公司的CEO只能有一个。 核心&#xff1a;确保一个类只有一个实例&#xff0c;全局访问。 关键词&#xff1a;唯一、全局访问。 工厂方…...

逻辑与非逻辑的弥聚

非逻辑弥聚与逻辑弥聚是复杂系统中两种不同的信息整合方式。逻辑弥聚侧重于通过明确的规则、规律和结构化方法&#xff0c;将分散的信息或功能进行有序的组织和集中处理&#xff0c;强调理性和确定性。而非逻辑弥聚则更多地涉及情感、直觉、经验等非线性、非结构化的因素&#…...

Python 从列表中删除值的多种实用方法详解

# Python 从列表中删除值的多种实用方法详解 在Python编程中&#xff0c;列表&#xff08;List&#xff09;是一种常用的数据结构&#xff0c;具有动态可变的特性。当我们需要从列表中删除元素时&#xff0c;根据不同的场景&#xff08;如按值删除、按索引删除、批量删除等&…...

C++多线程数据错乱

C多线程数据错乱&#xff08;也称为线程安全问题或数据竞争&#xff09;主要是由于多个线程在没有正确同步的情况下&#xff0c;并发访问和修改共享数据导致的。其主要原因包括以下几个方面: 一、线程交替执行导致的非原子操作 线程在执行时&#xff0c;可能会在中途被挂起&a…...

StarRocks Community Monthly Newsletter (Apr)

版本动态 3.4.3 版本更新 核心功能升级 Routine Load和Stream Load新增Lambda表达式支持&#xff0c;支持复杂的列数据提取 增强JSON数据处理能力&#xff0c;支持将JSON Array/Object转为ARRAY/MAP类型 优化information_schema.task_runs视图查询&#xff0c;新增LIMIT支持…...

延时双删-争议与我的思路-001

目录 概括大概思路目的场景思路一退货时间差 思路2思路3 最后 概括 延时双删,是指在代码中删除两次缓存. 第一次自己访问,先删除.之后直接访问数据库获得数据 第二次是指 在第一步之后,在删除一次缓存的数据 大概思路 不进行延时双删的.寻找别的解决方法 目的 主要是为了…...

Tomcat简述介绍

文章目录 Web服务器Tomcat的作用Tomcat分析目录结构 Web服务器 Web服务器的作用是接收客户端的请求&#xff0c;给客户端作出响应。 知名Java Web服务器 Tomcat&#xff08;Apache&#xff09;&#xff1a;用来开发学习使用&#xff1b;免费&#xff0c;开源JBoss&#xff0…...

掌握版本控制从本地到分布式

一、什么是版本控制&#xff1f; 版本控制是一种记录文件&#xff08;尤其是源代码&#xff09;在“时间轴”上变更的系统&#xff0c;主要功能包括&#xff1a; 历史回溯&#xff1a;随时恢复到任意版本的代码或文档&#xff1b;差异比较&#xff1a;查看两个版本之间的改动…...

Linux `touch` 命令深度解析与高阶应用指南

Linux `touch` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似操作对比二、选项系统详解1. 基础选项说明2. 时间格式说明三、高阶应用技巧1. 时间戳控制2. 批量文件操作3. 特殊文件处理四、企业级应用场景1. 日志系统维护2. 持续集成系统3. 安全审计跟踪五、…...

Django学习

1&#xff1a;在PyCharm终端&#xff1a; # 查看已安装的Django版本 python -m django --version # 或 pip show django # 卸载当前Django pip uninstall django# 安装指定版本&#xff08;例如Django 3.2.10&#xff09; pip install django3.2.10 2. 检查Python版本兼容性 …...

Java IO框架

I/O框架 流 流的分类&#xff1a; 按方向&#xff1a; 输入流&#xff1a;将存储设备的内容读入到内存中 输出流&#xff1a;将内存的内容写入到存储设备中 按单位&#xff1a; 字节流&#xff1a;以字节为单位&#xff0c;可以读取所有数据 字符流&#xff1a;以字符为单…...

Spring AI Alibaba集成阿里云百炼大模型

1.准备工作 开发环境&#xff1a;JDK17、SpringBoot3.x 2.引入maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…...

5月18总结

一.算法题总结 1. 解题思路&#xff1a;对于这个题&#xff0c;我最开始想到就是二分&#xff0c;但是头痛的是有三个解&#xff0c;如果我在-100到100之间二分&#xff0c;那么只能得出一个解&#xff0c;然后我就想了一下&#xff0c;这个要求精度&#xff0c;那么0.01这么小…...

动态规划(4)可视化理解:图形化思考

引言 动态规划作为一种强大的算法设计范式,其抽象性常常使初学者感到困惑。许多学习者在理解状态定义、状态转移方程和递归结构时遇到困难,这些困难往往源于动态规划问题的高度抽象性和复杂性。然而,人类的大脑天生擅长处理视觉信息,通过将抽象的动态规划概念转化为直观的…...

2025年- H31-Lc139- 242.回文链表(快慢指针)---java版--需2刷

1.题目描述 2.思路 &#xff08;1&#xff09;将链表取中位数&#xff0c;分为左右两部分。 &#xff08;2&#xff09;右半部分的元素进行反转链表&#xff0c;能达到O&#xff08;1&#xff09;的空间复杂度 &#xff08;3&#xff09;再判断左右部分的元素&#xff0c;是否…...

云原生安全:IaaS安全全解析(从基础到实践)

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念:IaaS的核心价值与安全边界 1.1 什么是IaaS? 基础设施即服务(Infrastructure as a Service)是云计算的基础层,提供虚拟机、存储、网络等基础资源。用户通过…...