- 博客(211)
- 收藏
- 关注
原创 【数据结构】_二叉树的遍历与销毁
队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。注:若采取设有头结点的单链表,可传一级指针,但仍然需传队尾结点指针,仍需要传递两个参数,总体而言依然较为麻烦。1. 此处队列代码实现直接衔接Queue.h与Queue.c文件,具体操作为:复制已实现的Queue.h与Queue.c文件,在当前二叉树的项目文件添加现有项,将以上两个文件拷贝到当前项目目录中后,在当前二叉树的.c文件中引用Queue.h即可。
2025-06-24 14:37:47
364
原创 【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
在3作为根结点的二叉树遍历中将i递增为1,递归调用其左子树,在1作为根结点的子树遍历中,将i递增为2,遍历完毕后返回到以3为根结点的二叉树的遍历函数中,再递归调用其右子树,此时就会出现本应将元素2存放至下标为2的位置上,但由于下标采用传值调用,使得将元素2存放至下标为1的位置处,导致元素覆盖,最终返回值为:[3,2,随机值]。遍历函数的大致实现思路与之前直接打印遍历结果的实现基本一致,只是需要将打印的语句修改为存入数组的语句。同时需要为返回的数组开辟空间,为了实现空间的高效合理应用,需要考虑开辟大小问题;
2025-06-23 15:33:14
585
原创 【数据结构】_二叉树基础OJ
在3作为根结点的二叉树遍历中将i递增为1,递归调用其左子树,在1作为根结点的子树遍历中,将i递增为2,遍历完毕后返回到以3为根结点的二叉树的遍历函数中,再递归调用其右子树,此时就会出现本应将元素2存放至下标为2的位置上,但由于下标采用传值调用,使得将元素2存放至下标为1的位置处,导致元素覆盖,最终返回值为:[3,2,随机值]。除根结点外,从第二层子树开始,根与根比较,一个根结点的左子树与另一个根结点的右子树比较,一个根结点的右子树与另一个根结点的左子树比较。内”,可一次性扩容100字节,但可能造成浪费;
2025-06-23 12:53:55
941
原创 【数据结构】_二叉树部分特征统计
这种写法存在一定问题:在比较左右子树高度时,重复调用了两次递归函数(三目操作符比较一次,返回再计算一次)。每个节点的左右子树高度被重复计算,导致时间复杂度呈指数级增长,在树节点较多时会导致性能急剧下降,甚至栈溢出。注:创建局部整型变量size对非空结点个数进行累加来计算结点总个数的思路是不可行的,因为递归调用中每次调用会创建新的栈帧,这样计算是错误的。与二叉树结点总个数计算思路类似,此处仅展示分治思路实现叶子结点个数计算。2. 若在左子树找到了值为x的结点,直接返回即可,无需再遍历右子树;
2025-06-22 20:16:51
519
1
原创 【Spring】_Spring事务与事务传播机制
由于id作为主键采取了自增方式,而此时第二次执行insert操作后id为2,说明第一次执行insert也执行成功,但事务回滚,故数据表user_info中又删除了id=1的用户信息;现已验证,使用@Transactional进行编程式事务管理时,当接口内部抛出运行时异常,或接口内部抛出异常并未捕获、抛出异常捕获但未正确处理时,都会导致事务回滚。编程式事务与声明式事务的不同体现在controller中,不同的事务类型将创建不同的Controller,稍后完成controller对service的调用。
2025-03-07 13:14:19
1215
原创 【Spring AOP】_静态代理与动态代理
Spring AOP是基于动态代理实现的。本文使用房屋、房东、中介模型介绍代理模式以及静态代理与动态代理。
2025-03-06 16:16:34
1005
原创 【Spring AOP】_切点类的切点表达式
在aspect包下创建MyAspect注解类:// 表示该注解用于标注方法// 表示该注解声明周期在程序执行时有效。
2025-03-05 20:25:46
822
原创 【Spring AOP】_使用注解编写AOP程序
现aspect包下由AspectDemo、AspectDemo1、AspectDemo2三个切面类,并在每个切面类中实现@Before通知和@After通知。(2)在当前类中,若在其类中实现的切点需要在其他类中使用,则切点必须以public修饰。上述使用方法中,在使用对应注解标注通知方法时,需要重复编写公共切点表达式,这很不方便;@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行。2、@Before:前置通知,此注解标注的通知方法在目标方法前被执行;
2025-03-05 19:33:08
863
原创 【软件测试】_selenium自动化测试:页面及窗口操作
在专栏前文中,已经介绍了对页面元素的操作,详见下文:【软件测试】_selenium自动化测试:定位元素与点击元素-CSDN博客【软件测试】_selenium自动化测试:操作页面元素的常用方法-CSDN博客对于WebElement类,可以通过该类及其成员方法获取并操作页面元素,但对于页面标题、URL等无法通过WebElement类相关方法获得。而实现了WebDriver接口的具体某一浏览器驱动类,如ChromeDriver,实例化后可通过该类型的对象对页面进行操作。
2025-03-04 18:19:48
837
原创 【软件测试】_selenium自动化测试:操作页面元素的常用方法
2、使用WebElement对象调用getText方法时无需传参,但调用getAttribute方法时需要传递使用的标签的对应属性名,如“百度一下”是input标签的value属性值,“百度热搜”是div标签的aria-label属性值;在打印热搜词条的文本时就使用到了getText方法,getText方法与getAttribute方法容易混淆,getAttribute方法用于获取页面元素的属性值,getText方法用于获取页面元素的文本。在上文中,已经实现了click方法对页面元素进行点击。
2025-03-03 14:49:10
1025
原创 【软件测试】_selenium自动化测试:定位元素与点击元素
在使用selenium实现百度搜索栏搜索关键词并查询的示例中,也调用了WebElement对象的click方法,对于绝大多数页面元素,都可以进行点击,不限制于type为submit的input标签。为了获取所有<li>标签对应的热搜词条的文本,将自动获取到的上述CSS位置删除:nth-child(1),2. 关于cssSelector方法的参数,#kw和#su,就是元素定位的CSS选择器使用方法。可见搜索栏对应的input标签的id为#kw,百度以下对应的input标签的id为#su;
2025-03-03 12:55:19
1158
原创 【SpringBoot】_统一功能处理:统一数据返回格式
仍以图书管理系统为例。为了实现后端方法返回给前端的数据都被封装为Result类型,若逐个修改封装会非常麻烦,接下来采用统一数据返回对现有方法进行处理。
2025-02-23 21:03:48
854
1
原创 【SpringBoot】_统一功能处理:拦截器
Slf4j@Component// 目标方法执行前执行@Overridelog.info("目标方法执行前");1、定义拦截器时,需要实现HandlerInterceptor接口;2、定义拦截器时,根据需要重写preHandle方法、postHandle方法和afterCompletion方法:(1)preHandle方法在目标方法执行前执行,返回类型为boolean类型,若返回true,表示放行,继续后续操作;若返回false,表示拦截成功;
2025-02-20 15:21:46
1288
原创 【Spring+MyBatis】_图书管理系统(下篇)
采用逻辑删除方式,即通过update操作实现,具体做法是将status置为0,令前端页面无法获取。但当前实现的updateBook方法仅支持一个id作为参数,即接口不可复用,需单独编写接口;同功能5的删除单个图书即单个更新图书状态的思路,批量删除图书就是批量更新图书状态;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;可见id为5和6的图书的状态被置为0,且并未从数据库中删除;
2025-02-19 17:23:45
1357
原创 【Spring+MyBatis】_图书管理系统(中篇)
【Spring+MyBatis】_图书管理系统(上篇)-CSDN博客(1)当前页的内容records(类型为List);参数:userName=admin&&password=admin。1、前端发送给后端:(封装为对象:PageRequest)创建用户表user_info和图书表book_info;2、后端发送给前端:(封装为对象:PageResult)以上两句都表示从num2+1行开始返回num1行数据;输入账号admin和密码admin后,即可成功登录;响应:成功返回true,失败返回false。
2025-02-18 19:49:28
1191
原创 【Spring+MyBatis】_图书管理系统(上篇)
(1)当前页的内容records(类型为List<BookInfo>);参数:userName=admin&&password=admin。1、前端发送给后端:(封装为对象:PageRequest)创建用户表user_info和图书表book_info;2、后端发送给前端:(封装为对象:PageResult)以上两句都表示从num2+1行开始返回num1行数据;输入账号admin和密码admin后,即可成功登录;响应:成功返回true,失败返回false。请求:/User/login。
2025-02-17 21:28:32
1195
原创 【Spring+MyBatis】留言墙的实现
在Spring专栏中,已经实现了Spring MVC版的留言墙,详见下文:【SpringMVC】_SpringMVC实现留言墙_使用springmvc完成一个简单的留言板-CSDN博客1、请求:/message/publish2、参数:使用对象MessageInfo进行存储参数:3、响应:true/false;_使用springmvc完成一个简单的留言板该版本的消息存储采用了List<MessageInfo>存储,每次重启服务器就会导致信息丢失。本文基于上文,对表白墙系统进行持久化。
2025-02-16 16:00:42
964
原创 【MyBatis】_动态SQL
为实现传递参数个数的灵活选择,MyBatis可以使用动态SQL方式操作数据库。本文介绍为实现增删查改基本操作的常用标签。动态SQL方式也有注解方式和XML方式两种方式,本文采用XML方式,在增操作中进行注解方式的示例。
2025-02-15 14:31:14
894
原创 【MyBatis】预编译SQL与即时SQL
使用MyBatis进行数据库操作在进行参数传递时,有#{ } 与 ${ }两种方式。本文介绍两种方式的区别;
2025-02-14 18:04:05
1121
原创 【MyBatis】_MyBatis操作数据库进行查操作的结果映射
在专栏前文介绍基本查操作的全列查(select* from 表名)时,提到过由于对象属性和数据表字段名不一致而导致的无法正确查询的情况:使用select* from userinfo的测试结果:MyBatis会自动根据数据库的字段名和java对象的属性名进行映射,映射规则为名称一致,即如果名称一样就进行赋值,当名称不一致时就会匹配失败;本文介绍当数据表字段名与java对象属性名不一致时,采用和基于xml实现MyBatis进行结果映射的三种方式。
2025-02-14 12:19:37
1076
原创 【MyBatis】_使用XML实现MyBatis
MyBatis作为一个持久层框架,用于进行数据库操作。MyBatis的实现方式有两种:(1)注解;(2)XML;本文介绍基于XML实现MyBatis。
2025-02-13 17:22:53
1117
原创 【MyBatis】_MyBatis操作数据库进行删与改操作
在专栏前文,已经介绍了使用MyBatis进行数据库操作的基本步骤和查操作:【MyBatis】_以查询为例熟悉MyBatis操作数据库流程-CSDN博客在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;
2025-02-13 14:52:03
710
原创 【MyBatis】_MyBatis操作数据库进行增操作
专栏前文已经介绍MyBatis操作数据库的基本流程:【MyBatis】_以查询为例熟悉MyBatis操作数据库流程-CSDN博客在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;
2025-02-13 11:01:34
893
原创 【MyBatis】_以查询为例熟悉MyBatis操作数据库流程
在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;观察得到:由于在UserInfo中采用了小驼峰命名(deleteFlag、createTime与updateTime),这与数据库名及其字段名使用的蛇形命名(delete_flag、create_time与update_time)有所不同,故而在上述访问中可见这几个字段对应的数据并未被正确读出,值为null;
2025-02-12 14:39:46
853
原创 【Spring】_配置Spring日志
在官网中可查看到默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzlogging:level:root: infocom:example:file:logback:重启程序查看目录处的日志文件名称格式:注:1、关于最大分割大小:日志文件的分割是以行来分割而不是以字符分割的。假设当前max-file-size设为1KB,并不是达到1KB就立即分割,会将本行日志存储后再进行分割;2、企业中通常日志分割大小为200M或500M;
2025-02-12 13:11:25
1100
原创 【Spring】_打印Spring日志
在当前打印日志的方法中,在打印日志的类中需创建一个logger对象,这使得打印日志时每次都需对一个类new 一个对象,较为麻烦。2、SLF4J是门面模式的典型应用,门面模式又称外观模式,提供了一个统一的接口,用来访问子系统中的一群接口,主要特征是定义了一个高层接口,让子系统更容易使用;注:1、日志对于系统运行信息的反映相对而言是滞后的,FATAL级已无法使用日志打印,故而只提供了其余四种级别的日志输出方法;1、SLF4J是一个日志框架,但SLF4J不是一个真实的日志框架实现,只是一个日志门面。
2025-02-11 13:30:25
771
原创 【数据结构】_堆排序问题
对于实现堆排序:1、若采用先建堆再排序的方法,则建大根堆实现降序,建小根堆实现升序;(通常不用)(1)这种方式需要调用HPPush方法,HPPush方法内部自行调用AdjustUp方法,并使用HPTop方法获取堆顶元素并逐个pop以实现降序或升序输出;(2)这种方式的空间复杂度为O(N);(较高)2、若采用不建堆直接排序的方法,则建大根堆实现升序,小根堆实现降序;(常用)
2025-02-10 14:26:02
1426
原创 【数据结构】_堆的实现
专栏前文中,已经介绍了入堆及向上调整算法,出堆及向下调整算法,详情见下文:实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;
2025-02-10 10:32:36
986
原创 【Spring】_SpringBoot的yml配置文件的读取
在上文中,已经介绍了SpringBoot项目中最常用的properties和yml配置文件的基本语法形式:【Spring】_SpringBoot配置文件-CSDN博客若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:# 自定义配置启动程序,通过Chrome进行访问:可见配置文件成功读取;若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:demo:启动程序,使用Chrome进行访问:可见配置文件成功读取;
2025-02-09 12:54:30
1695
原创 【数据结构】_堆的结构及向上、向下调整算法
实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;,删除最后一个结点后,再逐层调整父结点与子结点的大小关系,使其满足小根堆特性;(1)堆是完全二叉树;
2025-02-09 11:16:36
777
原创 【数据结构】_树与二叉树
2、除根节点外,其叶结点被分为M(M>0)个互不相交的集合T1,T2,T3...Tm,其中每一个集合Ti(1<=i<=m)又是一棵结构与树类型相似的子树,每棵树的根节点有且仅有一个前驱,可以有0个或多个后继;(11)结点的祖先:从根到该结点所经分支上的所有结点,如A是所有结点的祖先;(8)结点的层次:从根开始定义,根为第一层,根的子结点为第二层,以此类推;:含有子结点的结点,称该结点为其子结点的父结点,如A是B的父结点;:一个结点含有的子树的根节点称为该结点的子结点,如B是A的子结点;
2025-02-08 14:28:35
1105
原创 【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现
队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;令要实现的队列入队列5、6,将其入栈到第一个栈,而后将第一个栈视为push栈,仅用于入数据;思路:依次从第一个栈出栈4、3、2,并令其入栈第二个栈,再出栈第一个栈的元素1即可;令第一个栈入栈1、2、3、4四个元素,此时队列要求出队1,但当前栈只能出栈4,
2025-02-08 11:28:19
1110
原创 【Spring】_SpringBoot配置文件
若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:# 自定义配置启动程序,通过Chrome进行访问:可见配置文件成功读取;若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:demo:启动程序,使用Chrome进行访问:可见配置文件成功读取;在yml配置的文件使用${ }进行读取时,需将配置文件中的冒号与空格更换为.;
2025-02-07 19:11:25
1158
原创 【数据结构】_队列经典算法OJ:循环队列
目录1. 题目描述及链接2. 解题思路2.1 循环队列的设计2.2 关于循环队列的假溢出问题3. 程序注:部分方法实现细节题目链接:622. 设计循环队列 - 力扣(LeetCode)题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,
2025-02-07 13:02:28
754
原创 【数据结构】_栈与队列经典算法OJ:有效的括号
若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素。说明字符串中左括号比右括号多,则需对栈是否为空进行判断,若栈不为空,即字符串已遍历完毕,仍然有括号不匹配,返回false;给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。遍历字符串,将左括号入栈,对于右括号则出栈顶的左括号进行匹配。左括号必须以正确的顺序闭合。
2025-02-07 09:48:59
547
原创 【C++】_命名冲突与命名空间
3、C++标准库都放在一个叫std(standard)的命名空间中,包括cin、cout对象和enl函数等等,在日常练习中可以使用using namespace std;当运行时会默认首先在局部域寻找变量rand,寻找失败时会到全局域中寻找,全局域中有两个rand,一个是标准库stdlib.h中的rand函数,一个是定义的全局变量rand=0;4、使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对该问题。
2025-02-07 09:32:12
663
原创 【C++】_缺省参数与函数重载
缺省参数是声明或定义函数时为函数的参数制定一个默认值。在调用该函数时,如果没有指定实参,则采用该默认值。如果指定了实参,就使用指定的实参。Fun(2);Fun(3);Fun();return 0;函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(形参个数、类型、顺序)必须不同,(让编译器根据参数可以区分到底将形参传递给哪个函数)常用来处理实现功能类似,数据类型不同的问题。
2025-02-06 15:37:36
687
原创 【数据结构】_队列的结构与实现
队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。(2)若队列仅剩一个元素,按当前无特殊情况处理的方法实现,则pq->ptail未置空,使得其成为野指针,故需对其进行单独处理。注:若采取设有头结点的单链表,可传一级指针,但仍然需传队尾结点指针,仍需要传递两个参数,总体而言依然较为麻烦。若将数组头视为队头,数组尾视为队尾,则插入对应尾插实现方便,但删除对应头删实现麻烦;出队列:进行删除操作的一端称为队头;
2025-02-06 13:22:46
756
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人