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 栈 链表实现

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

12.11_黑马数据结构与算法笔记Java_第1张图片

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

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

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

12.11_黑马数据结构与算法笔记Java_第2张图片

12.11_黑马数据结构与算法笔记Java_第3张图片

12.11_黑马数据结构与算法笔记Java_第4张图片

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

12.11_黑马数据结构与算法笔记Java_第5张图片

12.11_黑马数据结构与算法笔记Java_第6张图片

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

12.11_黑马数据结构与算法笔记Java_第7张图片

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

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

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

12.11_黑马数据结构与算法笔记Java_第8张图片

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

12.11_黑马数据结构与算法笔记Java_第9张图片

 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.11_黑马数据结构与算法笔记Java_第10张图片

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

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

12.11_黑马数据结构与算法笔记Java_第11张图片

12.11_黑马数据结构与算法笔记Java_第12张图片

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

071 栈 数组实现

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

12.11_黑马数据结构与算法笔记Java_第13张图片

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

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

12.11_黑马数据结构与算法笔记Java_第14张图片

12.11_黑马数据结构与算法笔记Java_第15张图片

12.11_黑马数据结构与算法笔记Java_第16张图片

12.11_黑马数据结构与算法笔记Java_第17张图片

12.11_黑马数据结构与算法笔记Java_第18张图片

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

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

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

072 栈 e01 有效的括号

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

12.11_黑马数据结构与算法笔记Java_第19张图片

12.11_黑马数据结构与算法笔记Java_第20张图片

12.11_黑马数据结构与算法笔记Java_第21张图片

12.11_黑马数据结构与算法笔记Java_第22张图片

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

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

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

072 栈 e02 后缀表达式求值

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

12.11_黑马数据结构与算法笔记Java_第23张图片

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

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

12.11_黑马数据结构与算法笔记Java_第24张图片

12.11_黑马数据结构与算法笔记Java_第25张图片

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

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

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

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

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

12.11_黑马数据结构与算法笔记Java_第26张图片

12.11_黑马数据结构与算法笔记Java_第27张图片

用自己的话复述一遍:

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

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

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

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

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

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

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

12.11_黑马数据结构与算法笔记Java_第28张图片

12.11_黑马数据结构与算法笔记Java_第29张图片

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

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

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

12.11_黑马数据结构与算法笔记Java_第30张图片

12.11_黑马数据结构与算法笔记Java_第31张图片

12.11_黑马数据结构与算法笔记Java_第32张图片

以上,补充的内容 。 

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

072 栈 e04 双栈模拟队列

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

 12.11_黑马数据结构与算法笔记Java_第33张图片

12.11_黑马数据结构与算法笔记Java_第34张图片

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

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

12.11_黑马数据结构与算法笔记Java_第35张图片

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

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

12.11_黑马数据结构与算法笔记Java_第36张图片

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

thinking:迭代器?

12.11_黑马数据结构与算法笔记Java_第37张图片

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

12.11_黑马数据结构与算法笔记Java_第38张图片

12.11_黑马数据结构与算法笔记Java_第39张图片

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

thinking:接口规范?

12.11_黑马数据结构与算法笔记Java_第40张图片

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

12.11_黑马数据结构与算法笔记Java_第41张图片

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

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

072 栈 e05 单队列模拟栈

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

12.11_黑马数据结构与算法笔记Java_第42张图片

12.11_黑马数据结构与算法笔记Java_第43张图片

12.11_黑马数据结构与算法笔记Java_第44张图片

12.11_黑马数据结构与算法笔记Java_第45张图片

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

073 双端队列 链表实现 1

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

12.11_黑马数据结构与算法笔记Java_第46张图片

双向和双端:

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

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

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

12.11_黑马数据结构与算法笔记Java_第47张图片

12.11_黑马数据结构与算法笔记Java_第48张图片

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

074 双端队列 链表实现 2

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

12.11_黑马数据结构与算法笔记Java_第49张图片

12.11_黑马数据结构与算法笔记Java_第50张图片

12.11_黑马数据结构与算法笔记Java_第51张图片

12.11_黑马数据结构与算法笔记Java_第52张图片

12.11_黑马数据结构与算法笔记Java_第53张图片

12.11_黑马数据结构与算法笔记Java_第54张图片

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

075 双端队列 数组实现 1

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

12.11_黑马数据结构与算法笔记Java_第55张图片

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

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

12.11_黑马数据结构与算法笔记Java_第56张图片

12.11_黑马数据结构与算法笔记Java_第57张图片

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

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

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

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

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

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

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

12.11_黑马数据结构与算法笔记Java_第58张图片

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

12.11_黑马数据结构与算法笔记Java_第59张图片

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

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

12.11_黑马数据结构与算法笔记Java_第60张图片

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

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

076 双端队列 数组实现 2

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

12.11_黑马数据结构与算法笔记Java_第61张图片

12.11_黑马数据结构与算法笔记Java_第62张图片

12.11_黑马数据结构与算法笔记Java_第63张图片

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

12.11_黑马数据结构与算法笔记Java_第64张图片

12.11_黑马数据结构与算法笔记Java_第65张图片

12.11_黑马数据结构与算法笔记Java_第66张图片

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

077 双端队列 数组实现 3

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

12.11_黑马数据结构与算法笔记Java_第67张图片

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

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

12.11_黑马数据结构与算法笔记Java_第68张图片

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

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

12.11_黑马数据结构与算法笔记Java_第69张图片

12.11_黑马数据结构与算法笔记Java_第70张图片

12.11_黑马数据结构与算法笔记Java_第71张图片

 

12.11_黑马数据结构与算法笔记Java_第72张图片

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

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

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

12.11_黑马数据结构与算法笔记Java_第73张图片

12.11_黑马数据结构与算法笔记Java_第74张图片

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

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

以上。

你可能感兴趣的:(笔记,java,数据结构,leetcode,后端,开发语言,链表)