Java-数据结构-栈与队列(StackQueue)
一、栈(Stack)
① 栈的概念
栈是一种特殊的线性表,它只允许固定一端进行"插入元素"和"删除元素"的操作,这固定的一端被称作"栈顶",对应的另一端就被称做"栈底"。
📚 栈中的元素遵循后进先出的原则
什么是后进先出呢?在生活中也有很多类似的例子,比如叠放的书本,堆积的盘子,它们都是栈在生活中的体现~
📕 压栈:指栈插入元素的操作,一般叫做进栈/压栈/入栈(操作位置是栈顶)。
📕 出栈:指栈的删除操作(操作位置是栈顶)。
② 栈的使用
栈有以下六种方法:
方法 | 功能 |
Stack() | 构造一个空的栈 |
E push(E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中有效元素个数 |
boolean empty() | 判断栈是否为空 |
E push(E e)方法:
E pop()方法:
E peek()方法:
int size()方法:
boolean empty()方法:
③ 栈的模拟实现
栈的方法与操作与顺序表,链表等相比并不难,让我们也试着模拟实现一下~
1. 栈的基本框架
上面提到了,栈也是一种线性表,并且栈和顺序表其实是相似的,所以我们使用数组来充当栈~
接下来需要设置的东西就都和顺序表大差不差啦:
📕 创建elem数组充当栈
📕 定义usedSize代表栈内有效元素个数
📕 定义DEFAULE_SIZE为默认初始大小
📖 代码示例:
public class MyStack {private int[] elem;private int usedSize;private static final int DEFAULT_SIZE = 10;public MyStack(){elem = new int[10];}
}
📚 给大家看一眼我们要模拟实现的方法都有哪些:
2. display 方法
就没有什么多说的啦,遍历数组就好了。
📖 代码示例:
public void display(){System.out.print("[");for(int i = 0;i < usedSize;i++){System.out.print(elem[i]);if(i != usedSize - 1){System.out.print(", ");}}System.out.println("]");}
3. size 方法
返回栈有效元素个数即可。
📖 代码示例:
public int size(){return usedSize;}
4. push 方法
在实现push(入栈)方法之前,我们需要先实现两个辅助方法:
📕 入栈前需要先判断栈是否已满:
public boolean full(){if(usedSize == elem.length){return true;}return false;}
📕 如果栈已满,需要自动扩容:
public void grow(){elem = Arrays.copyOf(elem,elem.length * 2);}
等对栈是否满,以及扩容完毕后,我们将数据直接入栈即可~
📖 代码示例:
public void push(int num){if(full()){grow();}elem[usedSize] = num;usedSize++;}
5. pop 方法
虽然是出栈,但是pop会删除元素,所以先实现两个其他的辅助方法:
📕 删除元素前,我们需要知道栈是否为空:
public boolean empty(){if(usedSize == 0){return true;}return false;}
📕 如果栈为空,那么应该抛出异常:
public static class StackEmptyException extends RuntimeException{public StackEmptyException() {}public StackEmptyException(String message) {super(message);}}
📖 代码示例:
public int pop(){if(empty()){throw new StackEmptyException("栈为空异常!");}usedSize--;return elem[usedSize];}
6. peek 方法
和pop一样,不减少usedSize就好了
📖 代码示例:
public int peek(){if(empty()){throw new StackEmptyException("栈为空异常!");}return elem[usedSize - 1];}
完整代码:
import java.util.*;
public class MyStack {public static void main(String[] args) {}private int[] elem;private int usedSize;private static final int DEFAULT_SIZE = 10;public MyStack(){elem = new int[10];}public int size(){return usedSize;}public void push(int num){if(full()){grow();}elem[usedSize] = num;usedSize++;}public int pop(){if(empty()){throw new StackEmptyException("栈为空异常!");}usedSize--;return elem[usedSize];}public int peek(){if(empty()){throw new StackEmptyException("栈为空异常!");}return elem[usedSize - 1];}public void grow(){elem = Arrays.copyOf(elem,elem.length * 2);}public boolean full(){if(usedSize == elem.length){return true;}return false;}public boolean empty(){if(usedSize == 0){return true;}return false;}public void display(){System.out.print("[");for(int i = 0;i < usedSize;i++){System.out.print(elem[i]);if(i != usedSize - 1){System.out.print(", ");}}System.out.println("]");}public static class StackEmptyException extends RuntimeException{public StackEmptyException() {}public StackEmptyException(String message) {super(message);}}
}
④ 习题:有效的括号
学习了栈之后,正好做一道小题小试牛刀吧~这题如果在学习栈之前,单纯用字符串来解决的话,不出所料应该是相当麻烦的,因为要直接对字符串整体进行计算,就要考虑到很多种情况,比如左右括号数量,括号类型是否对应等,也没办法准确的去删除已分配好的括号,即便做出了删除的办法,但频繁的对字符串进行操作也会导致代码效率低下。
但如今学习了栈就不一样了,让我们用"栈"的方式看看这题该如何解决吧:
📚 思路分析:
📕 遍历字符串,当出现的' ( ',' [ ',' { '时放入栈中。
📕 当出现' ) ',' ] ',' } '时判断:如果此时栈顶元素(上一个符号)是否为其对应的括号
📕 如果是其对应括号,则"将栈顶元素出栈,然后遍历下一个字符"(此行为代表删除这对括号)
📕 如果不是其对应括号,则直接返回false(因为如果栈顶元素不匹配,则代表此字符是多余的)
📕 最后对栈进行判断,如果栈为空,则代表所有括号匹配成功,返回true,反之则返回false
📖 代码示例:
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();char[] str = s.toCharArray();for(int i = 0;i < str.length;i++){char c = str[i];if(c == ')' || c == ']' || c == '}'){if(stack.empty()){return false;}char n = stack.peek();if((n == '(' && c != ')') || (n == '[' && c != ']') || (n == '{' && c != '}')){return false;}stack.pop();}else {stack.push(c);}}if(stack.empty()){return true;}return false;}
}
二、队列(Queue)
① 队列的概念
还记得栈的性质嘛?没错,"后进先出",而队列恰恰与栈相反,队列的性质是"先进先出",也就是"只允许在一段进行插入数据操作","在另一端进行删除数据的操作"的特殊线性表。
📕 队尾:进行插入操作的一端
📕 对头:进行删除操作的一端
在生活中也有很多队列的体现,就比如"银行排队取钱",就像队列一样,先排队的人先取(先走),后排队的人后取(后走)~
② 队列的使用
由图我们可以看出,Queue是一个接口,并且我们还要知道,Queue底层是使用链表实现的,所以当我们对队列进行实例化的时候,是不能使用Queue的,而是应该new一个链表~
方法 | 功能 |
boolean offer(E e) | 元素入队列 |
E poll() | 元素出队列 |
peek() | 获取对头的元素 |
int size() | 获取队列的有效元素个数 |
boolean isEmpty() | 判断队列是否为空 |
boolean offer(E e) 方法
E poll() 方法
peek() 方法
int size() 方法
boolean isEmpty() 方法
③ 队列的模拟实现
大部分代码以及思路都和模拟实现双向链表是一致的,如果有需要可以前往Java-数据结构-链表(LinkedList)-双向链表-CSDN博客
进行更细致的学习,如果链表学会了那队列不在话下~
在刚刚我们知道了队列(Queue)的底层是使用链表来实现的,但是我们学习过了单向链表,也学习过双向链表,对于队列的模拟实现,我们应该使用哪种链表会更加方便呢?由于队列最主要的两种操作也就仅仅是入队和出队,那么我们便对这两点展开讨论:
📚 单向链表:
📕 如果从表头实现入队,那么就要从表尾实现出队,则入队为O(1),出队为O(n)
📕 如果从表尾实现入队,那么就要从表头实现出队,则入队为O(n),出队为O(1)
📚 双向链表:
📕 如果从表头实现入队,那么就要从表尾实现出队,则入队为O(1),出队为O(1)
📕 如果从表尾实现入队,那么就要从表头实现出队,则入队为O(1),出队为O(1)
所以我们应该使用双向链表来模拟实现队列~
1. 队列的基本框架
📕 由于是使用双向链表,所以框架基本一致~
public class MyQueue {public static class ListNode{private int val;private ListNode prev;private ListNode next;public ListNode(int val) {this.val = val;}}public ListNode front;public ListNode last;public int usedSize = 0;
}
2. offer 方法
其实本质上就是双向链表的尾插法~
📚 想要实现元素的入队并不难,我们需要注意以下几点:
📕 如果该队列为空,则需要将node变成新的head
📕 如果队列不为空,应该将node插入last的后继,并且让node的前驱变成last
📕 只要有元素入队,last就要进行更新
📖 代码示例:
public void offer(int e){ListNode node = new ListNode(e);if(front == null){front = node;}else{last.next = node;node.prev = last;}last = node;usedSize++;}
3. poll 方法
其实本质上就类似于双向链表的"删掉第一个结点"
📚 有以下注意事项:
📕 队列为空时,直接返回null
📕 队列中只有一个元素时直接全部置null
📕 队列中有多个元素时,
📖 代码示例:
public int poll() {int value = 0;if (front == null) {return -1;} else if (front == last) {last = null;front = null;} else {value = front.val;front = front.next;front.prev = null;--usedSize;}return value;}
4. peek 方法
获取队头元素,就是上面poll的不删除版本
📖 代码示例:
public int peek(){if(front == null){return -1;}return front.val;}
5. size & isEmpty 方法
📖 代码示例:
public int size(){return usedSize;}public boolean isEmpty(){return front == null;}
完整代码:
public class MyQueue {public static class ListNode {private int val;private ListNode prev;private ListNode next;public ListNode(int val) {this.val = val;}}public ListNode front;public ListNode last;public int usedSize = 0;public void offer(int e) {ListNode node = new ListNode(e);if (front == null) {front = node;} else {last.next = node;node.prev = last;}last = node;usedSize++;}public void display() {System.out.print("[");ListNode cur = front;while (cur != null) {System.out.print(cur.val);if (cur.next != null) {System.out.print(", ");}cur = cur.next;}System.out.print("]");}public int poll() {int value = 0;if (front == null) {return -1;} else if (front == last) {last = null;front = null;} else {value = front.val;front = front.next;front.prev = null;--usedSize;}return value;}public int peek(){if(front == null){return -1;}return front.val;}public int size(){return usedSize;}public boolean isEmpty(){return front == null;}
}
④ 习题:设计循环队列
📚 思路提示:
循环队列是个什么东西呢?其实就是将队列的头和尾连接到一起而已,没有什么特别的~我们来看看循环队列长什么样子:
这就是我们的循环队列了,其中内部的是元素的下标,外部的是用来存储元素的空间,其实看起来就像一个循环了的数组一样~
而刚刚也看到啦,就类似于环形的数组,所以对于这个环形链表,我们可以采取使用顺序表的方式来模拟实现它:
对于这个循环队列的实现,最重要的难点在于:当正常访问到队列的末尾时,如何判断它是空队列还是满队列,以及如何让它从队尾的下一位访问到队头。
对此我们有以下解法:
① 定义一个size记录存储的个数
size == len 就是满
size == 0 就是空
(该方法比较简单,就不过多介绍了)
② 牺牲一个空间来判满:
(我们在此使用这种方法来解决)
📕 基本框架:
class MyCircularQueue {public int left;public int right;public int[] elem;public MyCircularQueue(int k) {elem = new int[k + 1];}public boolean enQueue(int value) {return false;}public boolean deQueue() {return false;}public int Front() {return -1;}public int Rear() {return -1;}public boolean isEmpty() {return false;}public boolean isFull() {return false;}
}
📕 isFull 方法
判断循环队列是否为空的方法,由于我们刚刚说了:我们采用的是舍弃一个空间的方法,也就是队尾 + 1 正好等于该队列的大小时,也就舍弃一个空间,算它为满了。
📖 代码示例:
public boolean isFull() {if((right + 1) % elem.length == left){return true;}return false;}
📕 enQueue 方法
向队列中插入一个元素,这就要用到我们刚刚完成的 isFull 方法了
⭐ 如果队列为满,直接返回false
还有,别忘了我们是舍弃一块空间的方法,所以不能直接是 right % 队列大小
而应该是 (right + 1) % 队列大小,才能够跳过一块空间~
📖 代码示例:
public boolean enQueue(int value) {if(isFull()){return false;}elem[right] = value;right = (right + 1) % elem.length;return true;}
📕 isEmpty 方法
对于判断该循环队列是否为空的方法,我们只需要判断 left 是否等于 right 就行了,因为 left 始终都是在 right 后面的,当两者相等时,也就代表正好将链表的元素都删除了。
📖 代码示例:
public boolean isEmpty() {return left == right;}
📕 Front 方法
从队头获取元素的方法,只需要额外判断一下链表是否为空即可~
📖 代码示例:
public int Front() {if(isEmpty()){return -1;}return elem[left];}
📕 Rear 方法
获取队尾元素的方法,这个就没那么简单了,除了需要对队列是否为空做出判断,还需要注意这个问题:
我们一般插入元素后,right就会指向下一个位置,所以如果直接取right下标的元素是行不通的,我们需要取right的前一个元素~
或许你认为只需要对right - 1就好了呀,实则不然,别忘了我们是循环队列,所以当我们队列已满的时候,right 是在 0 位置的,这时我们需要访问的 index 就不是 right - 1了 ,而是队列大小-1。
📖 代码示例:
public int Rear() {if(isEmpty()){return -1;}int index = (right == 0 ? elem.length - 1 : right - 1);return elem[index];}
📕 deQueue 方法
删除队列中一个元素,首先判断是否为空,如果为空队列直接返回false~
随后就还是一样的,删除一位,队尾再向后走一位,并且记得是(left + 1)而不是left
📖 代码示例:
public boolean deQueue() {if(isEmpty()){return false;}elem[left] = 0;left = (left + 1) % elem.length;return true;}
也是顺利通过了~
那么这次关于栈与队列的知识,就为大家分享到这里啦,作者能力有限,如果有讲得不清晰或者不正确的地方,还请大家在评论区多多指出,我也会虚心学习的!那我们下次再见哦
相关文章:
Java-数据结构-栈与队列(StackQueue)
一、栈(Stack) ① 栈的概念 栈是一种特殊的线性表,它只允许固定一端进行"插入元素"和"删除元素"的操作,这固定的一端被称作"栈顶",对应的另一端就被称做"栈底"。 📚 栈中的元素遵循后…...
Transformer入门教程全解析(一)
一、开篇:走进Transformer的奇妙世界 在当今深度学习领域,Transformer 无疑是一颗璀璨的明星,它如同一股强大的变革力量,席卷了自然语言处理(NLP)乃至更多领域。从机器翻译到文本生成,从问答系…...
拼音读音基础
文章目录 一、音节1、结构2、声母3、韵母 二、声调 拼音读音往往被认为跟应试考试相关,学会正常交流口语以后不再进行关注,其实还是有必要了解细节、查漏补缺。 一、音节 1、结构 音节 声母 韵母;一个音节基本等于一个汉字; 2、…...
Qt 坐标系统和坐标变换
一、概述:1、QPainter在QPaintDevice上绘图的默认坐标系统是,原点(0,0)在左上角,x轴正方向水平向右,y轴正方向竖直向下的坐标系。 2、为了绘图的方便,QPainter提供了一些坐标变换的功能,通过平移、旋转、缩放等坐标变…...
【redis】ubuntu18安装redis7
在Ubuntu 18下安装Redis7可以通过以下两种方法实现:手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本: $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…...
Outlook 网页版一直提示:检测到重复的重定向
Outlook 网页版提示“检测到重复的重定向”通常是由于浏览器缓存、Cookie问题或浏览器插件引发的。可以按照以下步骤进行排查和解决: 1. 清除浏览器缓存和 Cookie 在浏览器设置中找到清除浏览数据的选项。勾选“缓存文件”和“Cookies”相关选项,然后清…...
初级前端面试题 - js
前言:众所周知,HTML,CSS,JS是学习前端所必备的。js的基础学好了,框架类的vue,react等都会接受的很快,因此js是前端很总要的一个部分,这篇文章将会结合面试题,对js的知识点进行总结 号外号外,这是…...
matlab的绘图的标题中(title)添加标量以及格式化输出
有时候我们需要在matlab绘制的图像的标题中添加一些变量,这样在修改某些参数后,标题会跟着一块儿变。可以采用如下的方法: x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…...
51单片机——串口通信(重点)
1、通信 通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信; 按照通信的数据同步方式,可分为异步通信和同步通信; 按照数据的传输方向又可分为单工、半双工和全双工通信 1.1 通信速率 衡量通信性能的一个非常…...
mapbox基础,style样式汇总,持续更新
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言二、🍀根属性2.1 so…...
用AI技术提升Flutter开发效率:ScriptEcho的力量
引言 在当今快速发展的技术时代,Flutter作为一种跨平台开发框架,正在越来越多的开发者中崭露头角。它不仅能够为开发者提供一套代码同时部署到iOS和Android平台的解决方案,还能帮助企业节省人力成本和开发时间。然而,对于新手开发…...
Java阶段四04
第4章-第4节 一、知识点 CSRF、token、JWT 二、目标 理解什么是CSRF攻击以及如何防范 理解什么是token 理解什么是JWT 理解session验证和JWT验证的区别 学会使用JWT 三、内容分析 重点 理解什么是CSRF攻击以及如何防范 理解什么是token 理解什么是JWT 理解session验…...
vivado 时钟指南
时钟指南 每个 FPGA 架构都为时钟提供有专用资源。掌握 FPGA 架构中的时钟资源,使您能够规划好自己的时钟,从而实现时钟 资源的最佳利用。大多数设计无需您了解这些细节。但如果您能够控制布局,同时对每个时钟域上的扇出有良好的思 路&a…...
git项目提交步骤(简洁版)
1.创建仓库 2.填写 信息 3.点击这个按钮 4.找到要上传的文件,在目录内右键点击 5.依次执行命令 在命令窗口中输入:git init 复制仓库地址: 在命令窗口中输入:git remote add origin 仓库地址 在命令窗口中输入:…...
Jmeter-压测时接口如何按照顺序执行
Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时,需要按照顺序进行压测,比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的,如果请求次数少,可能会按照顺序执行,但是随着次数增加…...
模式识别-Ch5-线性判别函数
Ch5 线性判别函数 文章目录 Ch5 线性判别函数引言:生成模型 vs判别模型生成模型 vs 判别模型判别模型分类 线性判别函数与决策面线性判别函数两类情况下的决策多类问题下决策 多类情形-线性机器线性决策面优缺点 广义线性判别函数例:二次判别函数例1: 1-…...
数据结构二叉树-C语言
数据结构二叉树-C语言 1.树1.1树的概念与结构1.2树的相关术语1.3树的表示1.4树形结构实际运用场景 2.二叉树2.1概念与结构2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3二叉树存储结构2.3.1顺序结构2.3.2链式结构 3.实现顺序结构的二叉树4.实现链式结构二叉树4.1前中后序遍…...
字节小米等后端岗位C++面试题
C 基础 引用和指针之间的区别?堆栈和堆中的内存分配有何区别?存在哪些类型的智能指针?unique_ptr 是如何实现的?我们如何强制在 unique_ptr 中仅存在一个对象所有者?shared_ptr 如何工作?对象之间如何同步…...
IOS HTTPS代理抓包工具使用教程
打开抓包软件 在设备列表中选择要抓包的 设备,然后选择功能区域中的 HTTPS代理抓包。根据弹出的提示按照配置文件和设置手机代理。如果是本机则会自动配置,只需要按照提醒操作即可。 iOS 抓包准备 通过 USB 将 iOS 设备连接到电脑,设备需解…...
renben-openstack-使用操作
管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型 名称:Centos7 VCPU数量:1 内存: 1024 根磁盘: 10G 其他的默认 点击创建云主机类型即可 界面会显示如下 创建公网络 (1)创建…...
HOW - Form 表单确认校验两种模式(以 Modal 场景为例)
目录 一、背景二、具体1. 模式一:点击确认进行校验提示2. 模式二:确认按钮依赖于表单内容实现说明 一、背景 基于react、antd form分别实现如下两种模式: 1、一个 Modal,点击确认进行校验提示2、一个 Modal,确认按钮…...
MATLAB算法实战应用案例精讲-【数模应用】图像边缘检测(附MATLAB和python代码实现)(二)
目录 前言 算法原理 相关概念 二值图像、灰度图像、彩色图像 邻接性、连通性 图像滤波 频率 滤波器 边缘检测算子:Sobel算子、Scharr算子、Laplacian算子、Canny算子 梯度计算 + 顶帽 + 黑帽 + 拉普拉斯金字塔 相位一致性(Phase Congruency,PC) 几种常见的算法…...
高考日语听力中常考2大类关键词
高考日语听力中,有些关键词的出现频率很高,同学们掌握这些关键词的读音和意思,可以提高听力答题的正确率,如时间类、地点类、天气类关键词……本文档为大家整理了干货,高考日语听力常考关键词,帮助同学们区分和积累常用词汇,记得要持续关注哦! 时间类关键词 1.星期 ∙…...
windows和linux的抓包方式
1.实验准备: 一台windows主机,一台linux主机 wireshark使用: 打开wireshark,这些有波动的就代表可以有流量经过该网卡,选择一张有流量经过的网卡 可以看到很多的流量,然后可以使用过滤器来过滤想要的流量…...
工业 4G 路由器赋能远程医疗,守护生命线
在医疗领域,尤其是偏远地区的医疗救治场景中,工业 4G 路由器正发挥着无可替代的关键作用,宛如一条坚韧的 “生命线”,为守护患者健康持续赋能。 偏远地区医疗资源相对匮乏,常常面临着专业医生短缺、诊疗设备有限等困境…...
《太阳之子》Build16524106官方中文学习版
《太阳之子》官方中文版https://pan.xunlei.com/s/VODabFuJ5gA7rCUACMulT5YGA1?pwdc47e# 集战术狙击、解谜与轻度潜行要素于一身,呈现独一无二的第三人称射击游戏体验。每关你只有一发子弹,但你可以进行在命中时重新瞄准、绕过障碍物、加速击穿护甲等操…...
shell-条件判断
目录 一、条件判断 1.按照文件类型进行判断 2.按照文件权限进行判断 3.两个文件之间进行比较 4.两个整数之间进行比较 5.字符串的判断 6.多重条件判断 二、if条件判断 1.单分支if条件语句 2.双分支if条件语句 (1)判断某文件是否存在 &#x…...
【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…...
20250110_ PyTorch中的张量操作
文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理: 总结 前言 1、torch.cat 函数 torch.cat 函数将两个张量拼接起来,具体地是…...
【ROS2】☆ launch之Python
☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写…...
unity rb.velocity和transform.position
rb.velocity和transform.position是用来控制物体位置的两种方式,前者通常用来控制人物的移动,它们的主要区别和适用场景如下 一,rb.velocity(控制刚体的速度) 它可以直接控制物体的速度,而不是物体的位置…...
景芯SOC设计实战
终身辅导、一对一辅导,手把手教您完成SoC全流程设计,从入门到进阶,带您掌握SoC芯片架构、算法、设计、验证、DFT、后端及低功耗全流程!直播视频不定期升级!让您快速超越同龄人! 景芯团队主打文档服务器实战…...
【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)
目录 ./real.exe错误1:ERROR while reading namelist physics./wrf.exe错误1:FATAL CALLED FROM FILE: <stdin> LINE: 2419 Warning: too many input landuse types参考./real.exe 错误1:ERROR while reading namelist physics 执行./real.exe时,报错如下: taski…...
Mysql快速列出来所有列信息
文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来,以备注中的中文名为列名。 实现思路 最终展示效果,即拼接出可执行执行…...
spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】
文章目录 Java发送邮箱的方式1. 基于 Javax.mail 实现关于附件上传的方法 2. 基于 org.apache.commons.mail 实现常见报错 3. 基于 spring-boot-starter-mail 实现(推荐) 实际开发时需要实现邮件发送,本文章实现如何从零实现邮件发送。也就是…...
数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
数据集-目标检测系列- 电话 测数据集 call DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! …...
Zstandard压缩算法
简介 Zstandard(缩写为zstd)是一种开源的无损数据压缩算法,主要设计目标是提供高比率的压缩和快速的解压缩速度。它由Yann Collet开发,并于2015年首次发布。 特点 高比率的压缩(通常比gzip更好)。快速的解压缩速度(通常比gzip更快)。支持流式解压缩。可以选择不同的压…...
npm i 报错
nodejs中 使用npm install命令时报错 npm err! file C: \user\admin\package.json_package.json 里缺少 description 和 repository 两个n字段。-CSDN博客...
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …...
EFCore HasDefaultValueSql
今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问,这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时,HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件: 1. 配置 HasDefaultValue 的…...
【数据结构】栈
目录 1.1 什么是栈 1.2 顺序栈 1.2.1 特性 1.3 链式栈 1.3.1 特性 总结: 1.1 什么是栈 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。 特点:栈是先进后出FILO…...
C++初阶—CC++内存管理
第一章:C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(si…...
【机器视觉】OpenCV 图像基本变换
文章目录 介绍机器视觉的核心组成部分机器视觉的关键技术和趋势 4. 图像的基本变换4.1 图像的放大与缩小4.2 图像的翻转4.3 图像的旋转4.4 仿射变换之图像平移4.5 仿射变换之获取变换矩阵4.6 透视变换 介绍 机器视觉(Machine Vision)是一门跨学科的领域…...
【数据库】四、数据库管理与维护
文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库,以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证: 服务器级别…...
徐克版射雕唤醒热血武侠魂,共赴新春侠义之约
2025年大年初一,由徐克执导的古装武侠电影《射雕英雄传:侠之大者》将在影院拉开帷幕,在精彩纷呈的春节档电影中,“大IP”“大导演”“大场面”等标签让这部电影自定档起便备受关注,其精良的制作和传统中国武侠风的设定…...
设计模式(观察者模式)
设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…...
能量函数和能量守恒
在之前的文章1中讨论了与循环坐标相对应的动量守恒定律和动量矩守恒定律,本文将由拉格朗日方程中导出能量函数,进一步讨论能量守恒定律,并给出耗散系统的处理方法,这其中用到的一个关键数学定理是欧拉定理(描述如何将一…...
【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...
使用 Maxwell 计算母线的电动势
三相短路事件的动力学 三相短路事件在电气系统中至关重要,因为三相之间的意外连接会导致电流大幅激增。如果管理不当,这些事件可能会造成损坏,因为它们会对电气元件(尤其是母线)产生极大的力和热效应。 短路时&#x…...
【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!
这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo步骤一&#…...