目录
[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 双栈模拟队列)
[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有写过。
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
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:迭代器?
---------------------------------------------------------------------------------------------------------------------------------
thinking:接口规范?
---------------------------------------------------------------------------------------------------------------------------------
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字层序遍历
---------------------------------------------------------------------------------------------------------------------------------
使用双端队列方便很多,因为可以从头部插入或者尾部插入。现在只要找到哪一行是偶数,哪一行是奇数就可以了。
---------------------------------------------------------------------------------------------------------------------------------
以上。