12.11_黑马数据结构与算法笔记Java

目录

070 栈 链表实现

概念理清:什么时候是指针的指向,什么时候是元素本身?

071 栈 数组实现

072 栈 e01 有效的括号

072 栈 e02 后缀表达式求值

072 栈 e03 中缀表达式转后缀1

072 栈 e03 中缀表达式转后缀2

072 栈 e03 中缀表达式转后缀3

072 栈 e04 双栈模拟队列

thinking:迭代器?

thinking:接口规范?

072 栈 e05 单队列模拟栈

073 双端队列 链表实现 1

074 双端队列 链表实现 2

075 双端队列 数组实现 1

076 双端队列 数组实现 2

077 双端队列 数组实现 3

078 双端队列 e01 二叉树Z字层序遍历


---------------------------------------------------------------------------------------------------------------------------------

070 栈 链表实现

---------------------------------------------------------------------------------------------------------------------------------

不同处: 针对数组和链表,我们可以在这条线上的任意一个位置进行操作,针对队列,我们只可以在头部删除,尾部添加,针对栈,我们只能在一端进行添加和删除,另一端是不可以动的。

相同处:都是线性的,就像一条线一样。

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

new Node<>(value ,head.next) :这里new出来的是2

head.next : head的指针指向谁呢?

=:head的指针指向new出来的2这个元素。

---------------------------------------------------------------------------------------------------------------------------------

 1:head.next 这里是2

2:

first.next: first指针的指向,也就是2指向1

head.next: head指针的指向

=:head指针的指向也是first指针的指向,也就是head指向了1

---------------------------------------------------------------------------------------------------------------------------------

概念理清:什么时候是指针的指向,什么时候是元素本身?

eg:1->2->3

什么时候是指针的指向,什么时候是元素本身,要看等号左右两边的意思。如果左右两边都在说指针,那就是这个指针的指向等于那个指针的指向,也就是说1指向了3 ,有一种跳过了2元素的感觉

如果左右两边讲的不是同一个东西,左边是元素,右边是讲指针,或者是左边是指针,右边是元素,那就是不跳过,1->2,等于号的意思就是指向右边的元素。我12.9有写过。

12.9_黑马数据结构与算法笔记Java-CSDN博客

-------------------------------------------------------------------------------------------------------------------------------- 

-------------------------------------------------------------------------------------------------------------------------------- 

071 栈 数组实现

---------------------------------------------------------------------------------------------------------------------------------

t也就是栈顶指针,永远在栈顶元素的右边一个位置。 

---------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------- 

array[--p]:先--再赋值给array。因为top是是栈顶指针,永远在栈顶元素的右边一个位置,你只有先减1,才是最后一个元素真正的位置。

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e01 有效的括号

---------------------------------------------------------------------------------------------------------------------------------

 如何判断所有的括号都配上对呢?检查队列里面还有没有元素,如果有说明没有配上,如果没有,说明全部配对成功。因为,你出现多少个左括号,就会放进去多少个右括号

而且要加上 !stack.isEmpty 因为,如果一开始进来的就是右括号的话,就会直接进入最后一个外围的else,然后与c进行==的比较,这时候就会出现空指针异常,因此,要确保stack也就是队列里面有元素才去比较,如果stack队列里面没有元素,就直接false返回即可。

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e02 后缀表达式求值

---------------------------------------------------------------------------------------------------------------------------------

具体操作:遇到数字,压入栈,遇到符号,将前两位数字拿出栈进行计算,然后再把结果压入栈 

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e03 中缀表达式转后缀1

---------------------------------------------------------------------------------------------------------------------------------

java帮我们把中缀表达式转换为后缀表达式,方便计算机进行运算。

---------------------------------------------------------------------------------------------------------------------------------

用自己的话复述一遍:

遇到非运算符的,直接拼起来

如果栈里面的元素遇到优先级比较高的,直接入栈

如果栈里面的元素遇到优先级比较低的,要先让栈里面的出栈,再把想入栈的符号入栈

如果栈里面的元素遇到平级的(平级遵守靠左的运算符先执行,靠右的运算符后执行),要先让栈里面的出栈,再把想入栈的符号入栈

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e03 中缀表达式转后缀2

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e03 中缀表达式转后缀3

---------------------------------------------------------------------------------------------------------------------------------

以上,补充的内容 。 

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e04 双栈模拟队列

---------------------------------------------------------------------------------------------------------------------------------

 

正常情况下,队列中只有一头可以做进和出的操作,那现在想要实现两头,在队列头移除,在队列尾添加,就要整两个队列,如图。队列尾添加,实际就是向右边的队列的顶部逐一添加。队列头移除,就需要将右边的所有元素移动到左边的队列当中去,再进行元素移除。 

---------------------------------------------------------------------------------------------------------------------------------

向队列头移除的步骤,以上。

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

thinking:迭代器?

Java迭代器详解,看这一篇就够了-CSDN博客 

---------------------------------------------------------------------------------------------------------------------------------

thinking:接口规范?

 java中为啥要使用接口_java为什么用接口-CSDN博客

为什么要用接口?接口到底有什么好处?_、请用自己的语言解释为什么要使用接口-CSDN博客

---------------------------------------------------------------------------------------------------------------------------------

072 栈 e05 单队列模拟栈

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

073 双端队列 链表实现 1

---------------------------------------------------------------------------------------------------------------------------------

双向和双端:

双向:既有pre指针也有next指针。

双端吧:头和尾都可以实现删除,移除,添加的操作。 

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

074 双端队列 链表实现 2

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

075 双端队列 数组实现 1

---------------------------------------------------------------------------------------------------------------------------------

offerLast: 先添加元素,再t+1。

---------------------------------------------------------------------------------------------------------------------------------

offerFirst:将h(指针)向左移动一位,因为是环形数组,因此用除法得到h(指针)该移动到的位置,再将元素添加到这个位置。

---------------------------------------------------------------------------------------------------------------------------------

如果不用size的话,仅仅用两个指针去判断空or满,就得浪费一个位置。 

---------------------------------------------------------------------------------------------------------------------------------

因为head指向的就是要移除的值,因此要先获取这个值再移动head(指针)。

因为tail指向的是要移除的值的后一位,因为要先让tail减减,才能获取到想要获取的值。

---------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------- 

没有用除法来防止索引越界问题,而是用循环的方式来杜绝。当下一次就要索引越界的时候,就返回0,让指针回到最初的位置,如果没有发生索引越界问题,就正常的加一

---------------------------------------------------------------------------------------------------------------------------------

没有用除法来防止索引越界问题,而是用循环的方式来杜绝。当下一次就要索引越界的时候,就返回数组长度-1的索引,也就是最后一个索引,让指针回到尾部,如果没有发生索引越界问题,就正常的减一 

---------------------------------------------------------------------------------------------------------------------------------

076 双端队列 数组实现 2

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

077 双端队列 数组实现 3

---------------------------------------------------------------------------------------------------------------------------------

基本类型:因为删除前100占用4个字节,删除后,0也是占用4个字节,因此删不删都无所谓。

---------------------------------------------------------------------------------------------------------------------------------

引用类型:如果没有人引用它的话,他就会在垃圾回收的时候释放内存,但是如果有人一直引用它的话,就无法释放内存。虽然说head向前走了一位,但是r1一直在引用E1,因此无法释放E1所占用的内存。因此,要将r1设置为null,也就意味着没有人引用E1了,就可以在垃圾回收的时候,把E1占用的内存给回收掉。

---------------------------------------------------------------------------------------------------------------------------------

 

---------------------------------------------------------------------------------------------------------------------------------

078 双端队列 e01 二叉树Z字层序遍历

---------------------------------------------------------------------------------------------------------------------------------

使用双端队列方便很多,因为可以从头部插入或者尾部插入。现在只要找到哪一行是偶数,哪一行是奇数就可以了。 

---------------------------------------------------------------------------------------------------------------------------------

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来看!天津靠谱Java培训机构哪家更好一点?

Java培训对某些计算机爱好者和IT从业者来说&#xff0c;是一道必经之路。包括Java基础、JavaWeb、JavaEE、大数据开发、人工智能等多方面的技术领域。参加Java培训可以帮助我们掌握计算机编程语言的基础知识&#xff0c;掌握Java语言编程技巧&#xff0c;快速提高编程水平。 报…

JVM虚拟机系统性学习-运行时数据区(方法区、程序计数器、直接内存)

方法区 方法区本质上是 Java 编译后代码的存储区域&#xff0c;存储了每一个类的结构信息&#xff0c;如&#xff1a;运行时常量池、成员变量、方法、构造方法和普通方法的字节码指令等内容 方法区主要存储的数据如下&#xff1a; Class 类型信息&#xff0c;如该 Class 为 …

【Android开发-28】Android中主题Theme和Toolbar的用法介绍

1&#xff0c;主题Theme 在Android中&#xff0c;主题&#xff08;Theme&#xff09;是一种用于定义应用程序用户界面外观的样式。主题可以包括颜色、字体、布局、控件样式等属性。通过使用主题&#xff0c;开发者可以轻松地为应用程序创建一致且具有吸引力的用户界面。 要使用…

人工智能在安全领域的应用

ChatGPT 等 AI 应用在网络安全领域的应用效果明显&#xff0c;其自动编程能力、分析能力及自身集成的知识库能够帮助网络安全从业者提升工作效率&#xff0c;改进组织的网络安全计划。 &#xff08;一&#xff09;代码生成与检测能力 可用于开发漏洞挖掘工具。如目前可以利用…

欧拉函数与欧拉定理

文章目录 AcWing 873. 欧拉函数题目链接欧拉函数欧拉函数的证明思路CODE时间复杂度分析 AcWing 874. 筛法求欧拉函数题目链接问题分析与时间复杂度CODE思路 欧拉定理 AcWing 873. 欧拉函数 题目链接 https://www.acwing.com/activity/content/problem/content/942/ 欧拉函数 …

数据结构与算法-动态规划-换钱的方法数

换钱的方法数 【题目】 给定数组 arr&#xff0c;arr 中所有的值都为正数且不重复。每个值代表一种面值的货币&#xff0c;每种面值 的货币可以使用任意张&#xff0c;再给定一个整数 aim&#xff0c;代表要找的钱数&#xff0c;求换钱有多少种方法。 【举例】 arr[5,10,25,1…

阶段五:深度学习和人工智能(学习如何构建和训练神经网络模型)

构建和训练神经网络模型是深度学习的核心任务之一。Python 是一种常用的编程语言,因为它有许多强大的库和框架,例如 TensorFlow、PyTorch、Keras 等,这些库和框架可以帮助我们更轻松地构建和训练神经网络模型。 下面是一个简单的示例,演示如何使用 Keras 构建和训练一个简…

Keil新建STM32软件工程 - (详细步骤图文)

文章目录 1. 前言2. 下载芯片对应的Keil开发包3. 下载芯片对应的标准外设库 - STM32F10x_StdPeriph_Lib_Vx.x.x4. 新建工程文件夹 - Demo34.1 移植标准外设库4.2 启动文件介绍及如何选择 5. 新建软件工程 - Demo5.1 打开Keil → Project → New uVision Project5.2 选择芯片型号…

从头到尾的数据之旅

目录 引言 链表介绍 单向链表的接口实现 结构 创建节点 头插 尾插 头删 尾删 打印 节点查找 节点前插入 节点删除 内存释放 总结 引言 在前面的学习中&#xff0c;我们深入了解了顺序表&#xff0c;通过其增删查改的操作&#xff0c;我们发现了顺序表在某些情况…

OpenGL学习(二)绘制三维图形 固定管线

一.简单步骤 考虑顶点数据上色旋转 二.完整代码 myopenglwidget.h // An highlighted block #ifndef MYOPENGLWIDGET_H #define MYOPENGLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLShaderProgram> #include <Q…

2023年福建省职业院校技能大赛中职组“网络安全”赛项规程含竞赛样题

2023年福建省职业院校技能大赛 中职组“网络安全”赛项规程 目录 一、赛项名称 二、竞赛目的 三、竞赛内容 四、竞赛方式 五、竞赛试题 六、竞赛规则 七、竞赛环境 八、技术规范 九、技术平台 十、成绩评定 十一、申诉与仲裁 十二、竞赛观摩 十三、竞赛视频 十…

如何批量给文件名加相同字段?

如何批量给文件名加相同字段&#xff1f;文件名批量修改是一项蕴藏了非常多知识的电脑操作技能&#xff0c;批量修改文件名称不仅仅是修改名称这么简单&#xff0c;有时候我们还可能需要批量王文件名称中添加一些相同的文字字段&#xff0c;批量操作注重的是高效率&#xff0c;…

docker 搭建 redis 主从节点

拉取 redis 镜像&#xff0c;比如拉取 redis v6.0.6 版本 docker pull redis:6.0.6docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE redis 6.0.6 7f7ce731b26f 4 weeks ago 158MB在你的工作目录下面创建 redis/write 和 redis/read 目…

Ubuntu(WSL)卸载与安装指定版本的 openssl

卸载 openssl 1&#xff09;查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2&#xff09;删除软件安装包 apt-get purge openssl 3&#xff09;删除配置文件 rm -rf /etc/ssl 安装 ope…

《Vue.js设计与实现》—Vue3响应系统的原理

一、响应式数据与副作用函数 1. 副作用函数 1-1 指令材料 在JavaScript中&#xff0c;副作用函数是指在执行过程中对外部环境产生可观察的变化或影响的函数。这种函数通常会修改全局变量、修改传入的参数、执行I/O操作&#xff08;如读写文件或发送网络请求&#xff09;、修…

论文阅读《Learning Adaptive Dense Event Stereo from the Image Domain》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Cho_Learning_Adaptive_Dense_Event_Stereo_From_the_Image_Domain_CVPR_2023_paper.html 概述 事件相机在低光照条件下可以稳定工作&#xff0c;然而&#xff0c;基于事件相机的立体方法在域迁移时性…

【教程】开始使用ipaguard进行代码加固混淆

开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过…

springMVC 学习总结(三) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

2-1基础算法-枚举/模拟

文章目录 1.枚举2.模拟 1.枚举 [例1] 特别数的和 评测系统 #include <iostream> using namespace std; bool pa(int x) {while (x) {if (x % 10 2 || x % 10 1 || x % 10 0 || x % 10 9) {return true;}else {x x / 10;}}return false; } int main() {int sum0;i…