今天是打基础的一天,了解队列和栈的实现。
上次学习这块记忆犹新,只要打基础,那天的我肯定是沮丧的,总会是说的时候都懂,写的时候不知道从哪里下手,看看这次会遇到什么“艰难险阻”及时记录下来。哈哈
Java 中 我总是不清楚为什么queue的crud 方法名字 != stack的,后来才发现,原来它俩都不是一个子类
-
Queue 是一个Intferface, 说明它的实现必须要用到one of the implementing classes: 一般我们是用Linked List 或者是arrayqueue, 据说更快
Queue queue = new LinkedList<>()
Offer & poll & peek -
Stack 是一个具体类。 由Deque接口实现, Deque stack = new ArrayDeque();
或者最简单版的: Stack stack = new Stack<>();
push & pop & peek
232.用栈实现队列
毛坯版本的逻辑解释:
常规的暴力解法:
逻辑上的问题:
放进stack的时候,就要保证是以一个queue的顺序放入的,这样之后的peek 和 pop 就正常做即可
我是用的stack 类实现
如果用ArrayDeque的话,就是要注意method变成了:pollFirst(). offerFirst()
代码上:我又又又又忘记写else了 导致第一个if之后是没有return的, 程序就又跑到下面去进行了操作去了TT
平均复杂度为1的写法:也是我想象中自己的写法:
错误的想法是:
当我push 的时候, 会先push到spare的stack里,只有在准备pop出来的时候,再去把他们全部都push到结果要显示的stack里, 这样数据只用先进入spare “备胎栈”在进入结果栈再pop出去。
错误点:
但是没有考虑到如果再加进去新得int时,依旧加到spare栈中,但是pop得时候,就不用把所有数据全部拿出来,直接pop现在正在res stack里得数值如果他有的话,这样数据只会从spare到rresult再出去, 省去了每次push 得时候都要把数据拿出来得不方便
225.用队列实现栈
TT 完全没有头绪
看了解答, 分为2种情况
1: 经常有push, 这样的话 最好让push中不要做太多的运算
先直接push在queue中, 在poll 中再进行整理,具体实现如下:
把除了最后一个的数都拿出来放到另一个备胎queue中,然后在把结果弹出,之后再把2个queue互换位置,就像是又回到了原貌。
2:经常有pop , vice versa
那就再每次push的时候就要保证存入的时候就已经是正确的格式,这样pop就可以直接拿出来,至于怎么存储:
保证有一个stack 一直是空的为了放数据,一旦放进去,就要立马把备胎队列里的值拿过来,在一起放回备胎队列, 这样再进行pop. peek。
总结来说,虽然是简单题,但是也需要通过这2道题了解如何运用规定的结构以什么样的顺序去实现。以让我们更好的了解stack 和 queue
(写了小半天的我悄然泪下