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字层序遍历

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

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

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

以上。

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值