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

【数据结构】第五弹——Stack 和 Queue

文章目录

  • 一. 栈(Stack)
    • 1.1 概念
    • 1.2 栈的使用
    • 1.3 栈的模拟实现
      • 1.3.1 顺序表结构
      • 1.3.2 进栈 压栈
      • 1.3.3 删除栈顶元素
      • 1.3.4 获取栈顶元素
      • 1.3.5 自定义异常
    • 1.4 栈的应用场景
      • 1.改变元素序列
      • 2. 将递归转化为循环
      • 3. 四道习题
    • 1.5 概念分区
  • 二. 队列(Queue)
    • 2.1 概念
    • 2.2 队列的使用
    • 2.3 队列模拟实现
    • 2.4 循环队列
      • 数组下标循环的小技巧
      • 设计循环队列
  • 三. 双端队列 (Deque)
  • 四. 两道面试题
    • 4.1 用队列实现栈
    • 4.2 用栈实现队列

一. 栈(Stack)

1.1 概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
在这里插入图片描述

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

1.2 栈的使用

在这里插入图片描述

public static void main(String[] args) {Stack<Integer> s = new Stack();s.push(1);s.push(2);s.push(3);s.push(4);System.out.println(s.size());   // 获取栈中有效元素个数---> 4System.out.println(s.peek());   // 获取栈顶元素---> 4s.pop();   // 4出栈,栈中剩余1   2   3,栈顶元素为3System.out.println(s.pop());   // 3出栈,栈中剩余1  2   栈顶元素为3if(s.empty()){System.out.println("栈空");}else{System.out.println(s.size());}}

1.3 栈的模拟实现

在这里插入图片描述
Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表

1.3.1 顺序表结构

public class MyStack {public int[] elem;public int usedSize;public MyStack() {this.elem = new int[10];}
}

1.3.2 进栈 压栈

 public void push(int val) {if(isFull()) {this.elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize++] = val;}public boolean isFull() {return usedSize == elem.length;}

1.3.3 删除栈顶元素

public int pop() {if(isEmpty()) {throw new EmptyStackException();}int val = elem[usedSize-1];usedSize--;return val;}

1.3.4 获取栈顶元素

 public int peek() {if(isEmpty()) {throw new EmptyStackException();}return elem[usedSize-1];}public boolean isEmpty() {return usedSize == 0;}

1.3.5 自定义异常

public class EmptyStackException extends RuntimeException{public EmptyStackException() {}public EmptyStackException(String message) {super(message);}
}

完整代码:

public class MyStack {public int[] elem;public int usedSize;public MyStack() {this.elem = new int[10];}public void push(int val) {if(isFull()) {this.elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize++] = val;}public boolean isFull() {return usedSize == elem.length;}public int pop() {if(isEmpty()) {throw new EmptyStackException();}int val = elem[usedSize-1];usedSize--;return val;}//获取栈顶元素 但是不删除public int peek() {if(isEmpty()) {throw new EmptyStackException();}return elem[usedSize-1];}public boolean isEmpty() {return usedSize == 0;}
}

1.4 栈的应用场景

1.改变元素序列

在这里插入图片描述

2. 将递归转化为循环

逆序打印链表

// 递归方式
void printList(Node head){if(null != head){printList(head.next);System.out.print(head.val + " ");}
}// 循环方式
void printList(Node head){if(null == head){return;}Stack<Node> s = new Stack<>();// 将链表中的结点保存在栈中Node cur = head;while(null != cur){s.push(cur);cur = cur.next;}// 将栈中的元素出栈while(!s.empty()){System.out.print(s.pop().val + " ");}
}

3. 四道习题

在这里插入图片描述

都是力扣牛客网上的题目,也是常见的面试题,会在刷题专栏详细讲解

1.5 概念分区

栈 虚拟机栈 栈帧有什么区别?

  • 栈是一种通用的数据结构概念,而虚拟机栈是在 Java 虚拟机环境下对栈这种数据结构的具体应用
  • 虚拟机栈由多个栈帧组成,每个栈帧对应一个方法的调用。当方法调用开始时,会创建一个新的栈帧并压入虚拟机栈;当方法调用结束时,对应的栈帧会从虚拟机栈中弹出
  • 综上所述,栈是一种抽象的数据结构,虚拟机栈是 JVM 中使用栈结构来管理方法调用的具体实现,而栈帧则是虚拟机栈中用于支持单个方法执行的具体数据结构

二. 队列(Queue)

2.1 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一段称为队头(Head/Front)
在这里插入图片描述

2.2 队列的使用

在Java中,Queue是个接口,底层是通过链表实现的
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

每个方法都有一个类似的方法
从效果上没有区别
在这里插入图片描述

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口

在这里插入图片描述

在这里插入图片描述

LinkedList实现的方法是很多的,可以直接拿来用
那就要这样写了:

LinkedList <Integer> q = new LinkedList<>();

2.3 队列模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构 和 链式结构

队列的实现使用顺序结构还是链式结构好?

我们先说链式结构:
在这里插入图片描述
在这里插入图片描述
双向链表实现队列

 static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val=val;}}public ListNode first=null;public ListNode last=null;public int useSize=0;public void offer(int val){//addLast尾插ListNode node=new ListNode(val);if(isEmpty()){first=last=null;}last.next=node;node.prev=last;last=last.next;useSize++;}public int poll(){//头删if(isEmpty()){return -1;}int val= first.val;//队头的数据first=first.next;if(first!=null){//只剩一个节点 直接useSize--first.prev=null;}useSize--;return 0;}public int peek(){//获取队头元素if(first==null){return -1;}return first.val;}public boolean isEmpty(){return useSize==0;}

双向链表实现队列效率很高 删除 插入都很方便

如果是数组实现队列该如何实现?

其实按照顺序遍历插入删除 可以实现,但是数组的遍历 一旦往后走就无法回去 被删除的空间没办法再次使用了

如果数组是一个环就好了,这样就可以走回去再次使用空间–这就是循环队列

2.4 循环队列

我们有时还会使用一种队列叫循环队列如操作系统课程讲解生产者消费者模型时可能就会使用循环队列。环形队列通常使用数组实现。

在这里插入图片描述
在这里插入图片描述

上面两个一个是空的环形队列 一个是满的环形队列

实现环形队列两个问题:
1.怎么判断空和满?
2.rear 和 front 下标从7到0怎么做到的?

解答:
空:只要front 和 rear 相遇就是空的
满 有三种方法判断
1.定义size size=数组长度就是满
2.添加标记 boolean类型元素 一开始是false一旦开始添加元素就变为true
3.浪费一个空间 判断rear是不是front

先放入元素 再rear++ 判断rear的下一个元素是不是front就可以了
在这里插入图片描述

判断 rear=(rear+1)%len

关于这个公式:

数组下标循环的小技巧

在这里插入图片描述
在这里插入图片描述
利用取模运算得到下标

好了,解决了这两个问题,我们可以使用循环队列了,正好我们来看一道设计循环队列的题目

设计循环队列

设计循环队列

class MyCircularQueue {//数组实现public int front;public int rear;public int[] elem;public MyCircularQueue(int k) {//使用浪费一个空间的方法来判断队列是否满//数组多给一个空间elem=new int[k+1];}public boolean enQueue(int value) {//插入 判满if(isFull()){return false;}elem[rear]=value;rear =(rear+1)%elem.length;return true;}public boolean deQueue() {//删除 判空if(isEmpty()){return false;}//头向后走 因为是环形的所以 向后走也不用担心前面的空间不能使用了front=(front+1)%elem.length;return true;}public int Front() {if(isEmpty()){return -1;}return elem[front];}public int Rear() {if(isEmpty()){return-1;}//return elem[rear];}public boolean isEmpty() {return rear==front;}public boolean isFull() {//rear 的下一个是 frontreturn (rear+1)%elem.length==front;}
}/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue obj = new MyCircularQueue(k);* boolean param_1 = obj.enQueue(value);* boolean param_2 = obj.deQueue();* int param_3 = obj.Front();* int param_4 = obj.Rear();* boolean param_5 = obj.isEmpty();* boolean param_6 = obj.isFull();*/

如果是这样写示例测到这里会有一个报错
原因在于我们并没有考虑 最重要的一点
rear 从尾到头 怎么办 front删除是向后走了 rear等于0 是可以的
rear 的下一个确实不是front 可以等于0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正确代码如下:

class MyCircularQueue {//数组实现public int front;public int rear;public int[] elem;public MyCircularQueue(int k) {//使用浪费一个空间的方法来判断队列是否满//数组多给一个空间elem=new int[k+1];}public boolean enQueue(int value) {//插入 判满if(isFull()){return false;}elem[rear]=value;rear =(rear+1)%elem.length;return true;}public boolean deQueue() {//删除 判空if(isEmpty()){return false;}//头向后走 因为是环形的所以 向后走也不用担心前面的空间不能使用了front=(front+1)%elem.length;return true;}public int Front() {if(isEmpty()){return -1;}return elem[front];}public int Rear() {if(isEmpty()){return-1;}//int index=(rear==0)?elem.length-1:rear-1;return elem[index];}public boolean isEmpty() {return rear==front;}public boolean isFull() {//rear 的下一个是 frontreturn (rear+1)%elem.length==front;}
}

三. 双端队列 (Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

在这里插入图片描述

Deque是一个接口,使用时必须创建LinkedList的对象
在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口

再来看一下我们数据结构第一篇文章画的图,想打关一样,已经学完这么多了

在这里插入图片描述
两种使用方式

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

四. 两道面试题

4.1 用队列实现栈

队列实现栈
在这里插入图片描述

class MyStack {public Queue<Integer> qu1;public Queue<Integer> qu2;public MyStack() {qu1=new LinkedList<>();qu2=new LinkedList<>();}//入栈public void push(int x) {if(!qu1.isEmpty()){qu1.offer(x);}else if(!qu2.isEmpty()){qu2.offer(x);}else{qu1.offer(x);}}//出栈public int pop() {if(empty()){return-1;}else if(!qu1.isEmpty()){ // 1不是空 将1的size-1个元素放到2for(int i=0;i<qu1.size()-1;i++){qu2.offer(qu1.poll());}return qu1.poll();}else{//2 不为空for(int i=0;i<qu2.size()-1;i++){qu1.offer(qu2.poll());}return qu2.poll();}}public int top() {if(empty()){return-1;}//用一个临时变量 把每个删除的都记录一下,最后一个就是栈顶if(!qu1.isEmpty()){ // 1不是空 将1的size-1个元素放到2int val=0;for(int i=0;i<qu1.size();i++){val=qu1.poll();qu2.offer(val);}return val;}else{//2 不为空int val=0;for(int i=0;i<qu2.size();i++){val=qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty()&&qu2.isEmpty();}
}

在这里插入图片描述
在这里插入图片描述
正确代码:

class MyStack {public Queue<Integer> qu1;public Queue<Integer> qu2;public MyStack() {qu1=new LinkedList<>();qu2=new LinkedList<>();}//入栈public void push(int x) {if(!qu1.isEmpty()){qu1.offer(x);}else if(!qu2.isEmpty()){qu2.offer(x);}else{qu1.offer(x);}}//出栈public int pop() {if(empty()){return-1;}else if(!qu1.isEmpty()){ // 1不是空 将1的size-1个元素放到2int size=qu1.size();for(int i=0;i<size-1;i++){qu2.offer(qu1.poll());}return qu1.poll();}else{//2 不为空int size=qu2.size();for(int i=0;i<size-1;i++){qu1.offer(qu2.poll());}return qu2.poll();}}public int top() {if(empty()){return-1;}//用一个临时变量 把每个删除的都记录一下,最后一个就是栈顶if(!qu1.isEmpty()){ // 1不是空 将1的size-1个元素放到2int size=qu1.size();int val=0;for(int i=0;i<size;i++){val=qu1.poll();qu2.offer(val);}return val;}else{//2 不为空int size=qu2.size();int val=0;for(int i=0;i<size;i++){val=qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty()&&qu2.isEmpty();}
}

4.2 用栈实现队列

在这里插入图片描述
按照我们画图得到的思路,写代码:

class MyQueue {
// 两个栈
public ArrayDeque<Integer> s1;
public ArrayDeque<Integer> s2;public MyQueue() {s1=new ArrayDeque<>();s2=new ArrayDeque<>();}public void push(int x) {//入队s1.push(x);}public int pop() {if(empty()){return -1;}if(s2.isEmpty()){while(!s1.isEmpty()){s2.push(s1.pop());}}return s2.pop();}public int peek() {if(empty()){return -1;}if(s2.isEmpty()){while(!s1.isEmpty()){s2.push(s1.pop());}}return s2.peek();}public boolean empty() {return s1.isEmpty()&&s2.isEmpty();}
}

相关文章:

【数据结构】第五弹——Stack 和 Queue

文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…...

LSTM如何解决梯度消失问题

LSTM如何解决梯度消失问题 一、传统RNN的梯度消失困境 在标准RNN中&#xff0c;隐藏状态更新公式为&#xff1a; h t tanh ⁡ ( W h h h t − 1 W x h x t b h ) h_t \tanh(W_{hh}h_{t-1} W_{xh}x_t b_h) ht​tanh(Whh​ht−1​Wxh​xt​bh​) 梯度计算通过链式法则展…...

什么是管理思维?

管理思维是指在管理活动中形成的系统性、战略性和创造性的思考方式&#xff0c;帮助个人或团队更高效地达成目标。它不仅适用于企业管理&#xff0c;也适用于个人成长、项目执行和复杂问题解决。以下是关于管理思维的核心内容&#xff1a; 一、管理思维的核心特征 1. 系统性思…...

缓存与内存;缺页中断;缓存映射:组相联

文章目录 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09;Memory Management Unit缺页中断 多级缓存缓存替换策略缓存的映射方式 内存&#xff08;RAM&#xff09;与缓存&#xff08;Cache&#xff09; 缓存&#xff1a; CPU 内部或非常靠近的高速存储&a…...

12.5/Q1,GBD高分文章解读

文章题目&#xff1a;Global, regional, and national burdens of early onset pancreatic cancer in adolescents and adults aged 15-49 years from 1990 to 2019 based on the Global Burden of Disease Study 2019: a cross-sectional stud DOI&#xff1a;10.1097/JS9.000…...

路由交换网络专题 | 第六章 | OSPF | BGP | BGP属性 | 防环机制

目录 拓扑图 &#xff08;1&#xff09;AS 400 内部使用 OSPF 路由协议&#xff0c;使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 &#xff08;2&#xff09;AS 400 内部使用 RIP 路由协议&#xff0c;使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 &#xff08;3&#…...

ubuntu 安装 redis server

ubuntu 安装 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…...

基于 Spring Boot实现的图书管理系统

Spring Boot图书管理系统详细分析文档 1. 项目概述 本文档对基于Spring Boot实现的图书管理系统进行详细分析。该项目是一个典型的Web应用程序&#xff0c;采用了Spring Boot框架&#xff0c;结合MyBatis作为ORM工具&#xff0c;实现了图书信息的管理功能&#xff0c;包括图书…...

gradle可用的下载地址(免费)

这几天接手一个老项目&#xff0c;想找gradle老版本的&#xff0c;但一搜&#xff0c;虽然在CSDN上搜索出来一堆&#xff0c;但都是收费&#xff0c;有些甚至要几十积分(吃相有点难看了)。 我找了一个能访问的地址&#xff0c;特地分享出来&#xff0c;有需要的自取&#xff01…...

发送百度地图的定位

在vuephp写的聊天软件项目中&#xff0c;增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能&#xff0c;需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤&#xff1a; 一、前端实现&#xff08;Vue/Uni-app…...

滑动窗口学习

2090. 半径为 k 的子数组平均值 题目 问题分析 给定一个数组 nums 和一个整数 k&#xff0c;需要构建一个新的数组 avgs&#xff0c;其中 avgs[i] 表示以 nums[i] 为中心且半径为 k 的子数组的平均值。如果在 i 前或后不足 k 个元素&#xff0c;则 avgs[i] 的值为 -1。 思路…...

python数据分析(二):Python Pandas索引技术详解

Python Pandas索引技术详解&#xff1a;从基础到多层索引 1. 引言 Pandas是Python数据分析的核心库&#xff0c;而索引技术是Pandas高效数据操作的关键。良好的索引使用可以显著提高数据查询和操作的效率。本文将系统介绍Pandas中的各种索引技术&#xff0c;包括基础索引、位…...

(15)VTK C++开发示例 --- 生成随机数的首选方法

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 vtkMinimalStandardRandomSequence 是 VTK&#xff08;Visualization Toolkit&#xff09;库中的一个类&#xff0c;…...

华为S系列交换机CPU占用率高问题排查与解决方案

问题概述 在华为S系列交换机(V100&V200版本)运行过程中&#xff0c;CPU占用率过高是一个常见问题&#xff0c;可能导致设备性能下降甚至业务中断。根据华为官方维护宝典&#xff0c;导致CPU占用率高的主要原因可分为四大类&#xff1a;网络攻击、网络震荡、网络环路和硬件…...

为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号

低速MCU&#xff08;如8位或16位单片机&#xff09;单板在辐射测试中出现 200MHz~1GHz的高频辐射信号&#xff0c;看似不合理&#xff0c;但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案&#xff1a; 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…...

docker本地虚拟机配置

docker 下载安装 yum install -y docker 如果报错 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache 修改docker 仓…...

【随机过程】柯尔莫哥洛夫微分方程总结

柯尔莫哥洛夫微分方程&#xff1a;用“水流扩散”理解概率演化 1. 核心思想 柯尔莫哥洛夫微分方程&#xff08;Kolmogorov Equations&#xff09;是描述**连续时间马尔可夫过程&#xff08;CTMC&#xff09;**中概率分布随时间演化的工具。 前向方程&#xff08;Fokker-Planc…...

AI领域:MCP 与 A2A 协议的关系

一、为何会出现MCP和A2A 协议是非常重要的东西&#xff0c;只有大家都遵循统一的协议&#xff0c;整体生态才好发展&#xff0c;正如有了HTML&#xff0c;互联网才快速发展&#xff0c;有了OpenAPI&#xff0c; API才会快速发展。 Agent目前是发展最快的领域&#xff0c;从最初…...

重学React(一):描述UI

背景&#xff1a;React现在已经更新到19了&#xff0c;文档地址也做了全面的更新&#xff0c;上一次系统性的学习还是在16-17的大版本更新。所以&#xff0c;现在就开始重新学习吧&#xff5e; 学习内容&#xff1a; React官网教程&#xff1a;https://zh-hans.react.dev/lea…...

代理模式(Proxy Pattern)详解:以延迟加载图片为例

在日常开发中&#xff0c;是否遇到过以下问题&#xff1a; “程序启动时图片太多&#xff0c;加载太慢&#xff01;” “用户还没看到图片就已经开始加载了&#xff0c;性能浪费&#xff01;” 此时&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09;便派上了用场。本…...

Power BI企业运营分析——数据大屏搭建思路

Power BI企业运营分析——数据大屏搭建思路 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 整合多源数据&#xff0c;实时监控关键指标&#xff0c;精准分析业务&#xff0c;快速识别问题机遇。其可视化看…...

HCIP-H12-821 核心知识梳理 (5)

Portal 认证场景中 AC 与 Portal 服务器通信使用的 Portal 协议基于 TCP&#xff1b;HTTP/HTTPS 可作为接入与认证协议&#xff1b;缺省情况下&#xff0c;接入设备处理 Portal 协议报文及向 Portal 服务器主动发送报文的目的端口号均为 50100 VRRP 协议心跳报文缺省发送间隔为…...

从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?

我们有一个长度为 M 的数组&#xff0c;现在我们想从中找出 最小的 N 个元素。例如&#xff1a; int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法&#xff1a;使用大小为 N 的「大顶堆」 原因分析&#xff1a; 我们想保留最小的 4 个元素…...

【AI工具】2025年主流自动化技术(供参考)

背景 前面完成了AutoIT的自动化操作的尝试&#xff0c;有惊喜有惊吓&#xff0c;就是能进行自动化控制&#xff0c;但是有点“笨”&#xff0c;于是就想找找同类好用的技术&#xff0c;有了这篇自动化技术比较分析的文档&#xff0c;资料参考了AI总结的内容。 autoit的使用&am…...

1.微服务拆分与通信模式

目录 一、微服务拆分原则与策略 业务驱动拆分方法论 • DDD&#xff08;领域驱动设计&#xff09;中的限界上下文划分 • 业务功能正交性评估&#xff08;高内聚、低耦合&#xff09; 技术架构拆分策略 • 数据层拆分&#xff08;垂直分库 vs 水平分表&#xff09; • 服务粒…...

【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?

1. 引用类型及其特点 强引用(Strong Reference): 定义:最常见的引用类型,通过new关键字直接创建。回收条件:只要强引用存在,对象不会被GC回收。示例:Object obj = new Object(); // 强引用特点: 强引用是导致内存泄漏的常见原因(如未及时置为null)。手动断开引用:…...

使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片

使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) vide…...

基于STM32的室内环境监测系统

目录 一、前言 二、项目功能说明 三、主要元器件 四、接线说明 五、原理图与PCB 六、手机APP 七、完整资料 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; 咸鱼商品链接&#xff1a; 基于STM32的室内环境监测系统商品链接 二、项目功能说明 基础功…...

乐迪电玩发卡查分与控制面板模块逻辑解析

本篇为《美乐迪电玩全套系统搭建》系列的第四篇&#xff0c;聚焦后台功能模块中的发卡与查分系统。针对运营侧常见需求&#xff08;如玩家状态查验、补卡操作、积分调整等&#xff09;&#xff0c;本篇将完整剖析其 PHP 端实现逻辑、数据结构及权限管理机制。 一、模块结构与入…...

Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?

Spring 事务实现原理 Spring 的事务管理基于 AOP&#xff08;面向切面编程&#xff09; 和 代理模式&#xff0c;通过以下核心组件实现&#xff1a; 事务管理器&#xff08;PlatformTransactionManager&#xff09; Spring 提供了统一的事务抽象接口&#xff08;如 DataSource…...

网络原理 - 4(TCP - 1)

目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完&#xff01; TCP 协议 TCP 全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09;&#xff0c;要对数据的传输进行一个详细的控制。 TCP 协议段格…...

SVT-AV1编码器中的模块

一 模块列表 1 svt_input_cmd_creator 2 svt_input_buffer_header_creator 3 svt_input_y8b_creator 4 svt_output_buffer_header_creator 5 svt_output_recon_buffer_header_creator 6 svt_aom_resource_coordination_result_creator 7 svt_aom_picture_analysis_result_creat…...

金融数据分析(Python)个人学习笔记(12):网络爬虫

一、导入模块和函数 from bs4 import BeautifulSoup from urllib.request import urlopen import re from urllib.error import HTTPError from time import timebs4&#xff1a;用于解析HTML和XML文档的Python库。 BeautifulSoup&#xff1a;方便地从网页内容中提取和处理数据…...

子网划分的学习

定长子网划分&#xff08;Fixed-length Subnetting&#xff09; 也叫做固定长度子网划分&#xff0c;是指在一个IP网络中&#xff0c;把网络划分成若干个大小相等的子网&#xff0c;每个子网的子网掩码长度是一样的。 一、定长子网划分的背景 在早期的IP地址分配中&#xff0…...

Spark2 之 memorypool

cpp/core/memory/ArrowMemoryPool.cc cpp/core/memory/MemoryAllocator.cc VeloxMemoryManager cpp/velox/memory/VeloxMemoryManager.cc VeloxMemoryManager::VeloxMemoryManager(const std::string& kind, std::unique_ptr<AllocationListe...

短视频+直播商城系统源码全解析:音视频流、商品组件逻辑剖析

时下&#xff0c;无论是依托私域流量运营的品牌方&#xff0c;还是追求用户粘性与转化率的内容创作者&#xff0c;搭建一套完整的短视频直播商城系统源码&#xff0c;已成为提升用户体验、增加商业变现能力的关键。本文将围绕三大核心模块——音视频流技术架构、商品组件设计、…...

IO流详解

IO流 用于读写数据的&#xff08;可以读写文件&#xff0c;或网络中的数据&#xff09; 概述 I指 Input&#xff0c;称为输入流&#xff1a;负责从磁盘或网络上将数据读到内存中去 O指Output&#xff0c;称为输出流&#xff0c;负责写数据出去到网络或磁盘上 因此&#xff…...

linux下使用wireshark捕捉snmp报文

1、安装wireshark并解决wireshark权限不足问题 解决linux普通用户使用Wireshark的权限不足问题_麒麟系统中wireshark 运行显示权限不够-CSDN博客 2、Linux下安装并配置SNMP软件包 &#xff08;deepseek给出的解答&#xff0c;目前会产生request包&#xff0c;但是会连接不上&a…...

ClickHouse 设计与细节

1. 引言 ClickHouse 是一款备受欢迎的开源列式在线分析处理 (OLAP) 数据库管理系统&#xff0c;专为在海量数据集上实现高性能实时分析而设计&#xff0c;并具备极高的数据摄取速率 1。其在各种行业中得到了广泛应用&#xff0c;包括众多知名企业&#xff0c;例如超过半数的财…...

Spring Boot 启动生命周期详解

Spring Boot 启动生命周期详解 1. 启动阶段划分 Spring Boot 启动过程分为 4个核心阶段&#xff0c;每个阶段涉及不同的核心类和执行逻辑&#xff1a; 阶段 1&#xff1a;预初始化&#xff08;Pre-initialization&#xff09; 目标&#xff1a;准备启动器和环境配置关键类&am…...

使用Java对接StockTV全球金融数据API。马来西亚金融数据API

以下是一篇关于如何使用Java对接StockTV API的教程博客&#xff0c;基于您提供的接口文档编写&#xff1a; 使用Java对接StockTV全球金融数据API 一、API简介 StockTV提供覆盖全球40交易所的实时金融市场数据&#xff0c;包括&#xff1a; 股票&#xff1a;印度、美股、A股等…...

逐位逼近法计算对数的小数部分

逐位逼近法&#xff08;Bit-by-Bit Approximation&#xff09;是一种通过 迭代和位操作 高效计算数学函数&#xff08;如对数、平方根等&#xff09;的方法。它特别适用于 不支持浮点运算的环境&#xff08;如区块链智能合约&#xff09;&#xff0c;因为所有计算均通过 整数乘…...

SpringbootWeb开发(注解和依赖配置)

Lombok 工具 Spring Web web开发相关依赖 MyBatis Framework MyBatis驱动 MySQL Driver MySql驱动包 Restful 风格 Slf4j 记录日志对象 RequestMapping(value “/depts”, method RequestMethod.GET) //指定请求方式为GET method 指定请求方式 GetMapping 限定请求方式为Get…...

【AI News | 20250422】每日AI进展

AI Repos 1、no-ocr 不需要复杂文本提取的 AI 文档处理工具&#xff0c;只需上传 PDF 文件&#xff0c;即可快速搜索或询问关于多个文档集合中的内容&#xff0c;无需依赖传统 OCR 技术&#xff0c;大大提升文档分析效率。创建和管理 PDF/文档集合&#xff0c;按"案例&qu…...

110. 平衡二叉树

目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 二、解题思路 ✅ 平衡二叉树的定义 一棵二叉树是平衡的&#xff0c;满足以下两个条件&#xff1a; 左子树是平衡二叉树&#xff1b; 右子树…...

yarn的介绍与操作,yarn和npm的选择

&#x1f9f6; 一、Yarn 是什么&#xff1f; Yarn 是由 Facebook&#xff08;Meta&#xff09;开发的 JavaScript 包管理工具&#xff0c;用于替代 npm&#xff0c;解决它在早期版本中存在的一些问题。 ✅ Yarn 的优势&#xff08;v1.x&#xff09;&#xff1a; &#x1f4e…...

人工智能赋能医疗影像诊断:开启精准医疗新时代

在当今数字化、智能化飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐渐渗透到各个行业&#xff0c;其中医疗领域更是成为了 AI 技术大展身手的重要舞台&#xff0c;而医疗影像诊断作为医疗行业中的关键环节&#xff0c;正因 AI 的赋能而发生着深刻变革…...

【汽车ECU电控数据管理篇】S19文件格式解析篇章

一、S19格式是啥 在电控文件管理的初期阶段&#xff0c;我首次接触到的是 A2L 和 HEX 文件。其中&#xff0c;A2L 文件主要承担着描述性功能&#xff0c;它详细地描述了各种参数和配置等相关信息。而 HEX 文件则是一种刷写文件&#xff0c;其内部明确记录了具体的地址以及对应的…...

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…...

Windows 同步-Windows 单向链表和互锁链表

Windows 单向链表&#xff08;SList&#xff09;同步机制详解 核心概念 SList&#xff08;Singly-Linked List&#xff09;是一种基于非阻塞算法实现的线程安全链表结构&#xff0c;具有以下特性&#xff1a; ​​原子性操作​​&#xff1a;所有插入/删除操作均通过硬件级原…...