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

目录

[070 栈 链表实现](#070 栈 链表实现)

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

[071 栈 数组实现](#071 栈 数组实现)

[072 栈 e01 有效的括号](#072 栈 e01 有效的括号)

[072 栈 e02 后缀表达式求值](#072 栈 e02 后缀表达式求值)

[072 栈 e03 中缀表达式转后缀1](#072 栈 e03 中缀表达式转后缀1)

[072 栈 e03 中缀表达式转后缀2](#072 栈 e03 中缀表达式转后缀2)

[072 栈 e03 中缀表达式转后缀3](#072 栈 e03 中缀表达式转后缀3)

[072 栈 e04 双栈模拟队列](#072 栈 e04 双栈模拟队列)

thinking:迭代器?

thinking:接口规范?

[072 栈 e05 单队列模拟栈](#072 栈 e05 单队列模拟栈)

[073 双端队列 链表实现 1](#073 双端队列 链表实现 1)

[074 双端队列 链表实现 2](#074 双端队列 链表实现 2)

[075 双端队列 数组实现 1](#075 双端队列 数组实现 1)

[076 双端队列 数组实现 2](#076 双端队列 数组实现 2)

[077 双端队列 数组实现 3](#077 双端队列 数组实现 3)

[078 双端队列 e01 二叉树Z字层序遍历](#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字层序遍历

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

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

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

以上。

相关推荐
Heisenberg~27 分钟前
详解八大排序(五)------(计数排序,时间复杂度)
c语言·数据结构·排序算法
Abladol-aj27 分钟前
并发和并行的基础知识
java·linux·windows
清水白石00828 分钟前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
Elihuss1 小时前
ONVIF协议操作摄像头方法
开发语言·php
Swift社区5 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht5 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht5 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20245 小时前
Swift 数组
开发语言
xiaoyalian5 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
吾日三省吾码6 小时前
JVM 性能调优
java