leetcode-栈总结

leetcode-155-最小栈(min stack)-java
解法1(用2个栈)
由于用常数时间得到最小值,显然要以空间换时间
设置两个stack,一个为数的stack,一个为此时min的stack
插入一个数,如果它比min的top都小,则min add 它 否则 add min的top
解法2(一个栈,一个min)
在入栈时,如果这个元素小于等于旧的最小值,那么,我们让旧的最小值入栈,然后将元素值赋给最小值,即新的最小值,然后正常将这个元素入栈;在出栈时,如果栈顶元素与最小值相等,说明他的下一个元素是之前push的旧的最小值(上一个),出栈后,将这个之前的最小值赋值给最新的最小值。(每次push进去的最小值都是下面元素的最小值)

leetcode-java-20-有效的括号(valid parentheses)-java
用栈,如果是前面的括号则直接入栈,如果是后面的先检查栈是否为空,然后看pop出的括号是否为对应的前括号,最后遍历完检查栈是否为空,若不为空,这说明有前扩或未对应
用switch和各种方法简化了流程
如何检查一个数是否在几个值之内,和是否对应另一个值,可以用map的方式进行简化和对应

leetcode-150- 逆波兰表达式求值(evaluate reverse polish notation)-java
建立一个栈,对数组进行for循环
如果是数字,则直接放入栈
如果是符号,从栈中取出两个数字,第一个取出是右边的操作数,第二个是左边的,根据符号运算出结果,再放入栈中
最后栈中仅仅剩下一个数,就是结果,取出即可

leetcode-341-扁平化嵌套列表迭代器-java
解法1
内部有一个stack,index大的先放进去,小的后放进去。next时,弹出最上面的,如果是数字,直接返回。如果不是数字,将列表从后到前依次放进stack,然后再次调用next方法。
hasNext,由于会出现stack不为空,但是NestInteger为{}的情况,需要先调用next得到返回的结果不为null,再返回true,同时把返回的结果放到nextInteger里面,next方法优先返回nextInteger,然后清空这个字段

解法2

在类中添加nestedList、stack、iteratot、integer四个属性,分别对应嵌套列表、迭代器存储栈、当前迭代器、当前遍历整数
构造函数初始化nestedList、iterator,iterator对应的就是构造参数的迭代器。
重写hasNext()函数,主要逻辑为:

当前迭代器若hasNext()为true
判断next()是否为整数,若为整数则赋值integer,返回``true`
判断next()是否为列表,则将当前迭代器暂存至stack,并更新iterator为当前列表的迭代器,递归hasNext()函数

当前迭代器若hasNext()为false且stack非空,则迭代器出栈更新为当前iterator,递归hasNext()函数
其他情况则代表,整个扁平化嵌套列表已遍历完毕,返回false

重写next()函数,迭代器的使用规则是hasNext()返回为true时调用next()函数获取下一值,再次直接返回integer(当前遍历整数)即可。

你可能感兴趣的:(数据结构-栈,leetcode总结)