引入
这里主要想介绍两种栈的用法,分别对应题目901. 股票价格跨度和题目232. 用栈实现队列。
具体题目不做赘述。
单调栈
901.股票价格跨度
这道题利用了 单调增栈每次插入新数据时,会一次性将比自己小的元素全部排出 的特性
这个特性正好和题目里的 价格小于或等于今天价格的最大连续日 是刚好吻合的
换句话说,我们单次插入某值时抛弃的元素组,就是该值前的一段连续日
所以每次插入新数据,都会将栈顶 折叠 一次,你可以想象成俄罗斯方块消层那种感觉
问题在于,**因为单调栈是要把元素都丢弃的,状态都被“折叠”了,我们会丢失长度,**所以容易想到,我们需要cache一下之前栈内元素被折叠的长度
cache有很多种方式,可以用hash表等数据结构,也可以用动态规划
但这题的更优解是,使用另一个同步栈来缓存。
我们如果发现插入元素满足本身栈的递减需求,则折叠栈直接插入1,因为该值前一个值是比它大的,他们间隔1天。
如果不满足,则开始折叠,并将折叠栈中,值比它小的所有段落的折叠长度都累计起来,再重新插入折叠栈中保存。
用栈实现队列
232.用栈实现队列
队列做到的是先进先出,栈做到的是先进后出。
如何用栈做到先进先出呢?
我们这里使用两个栈,一个栈只负责入队,一个栈只负责出队。
当队列有入队操作的时候,直接压入(入队)栈。
当队列有出队操作的时候,首先判断(出队)栈是否为空,如果为空将(入队)栈的所有元素导入(出队)栈,此时由于(入队)栈本身是先进后出的,到了(出队)栈中,最先进的元素反而在最上面,直接pop即可;如果判断(出队)栈不为空,也是直接pop即可。
如下图所示:
所以判断队列是否为空,就是判断两个栈是否都为空即可。