Leetcode901.股票价格跨度——栈的其他用法

引入

这里主要想介绍两种栈的用法,分别对应题目901. 股票价格跨度和题目232. 用栈实现队列

具体题目不做赘述。

单调栈

901.股票价格跨度

这道题利用了 单调增栈每次插入新数据时,会一次性将比自己小的元素全部排出 的特性
这个特性正好和题目里的 价格小于或等于今天价格的最大连续日 是刚好吻合的

换句话说,我们单次插入某值时抛弃的元素组,就是该值前的一段连续日
所以每次插入新数据,都会将栈顶 折叠 一次,你可以想象成俄罗斯方块消层那种感觉

问题在于,**因为单调栈是要把元素都丢弃的,状态都被“折叠”了,我们会丢失长度,**所以容易想到,我们需要cache一下之前栈内元素被折叠的长度
cache有很多种方式,可以用hash表等数据结构,也可以用动态规划
但这题的更优解是,使用另一个同步栈来缓存。


我们如果发现插入元素满足本身栈的递减需求,则折叠栈直接插入1,因为该值前一个值是比它大的,他们间隔1天。
如果不满足,则开始折叠,并将折叠栈中,值比它小的所有段落的折叠长度都累计起来,再重新插入折叠栈中保存。

用栈实现队列

232.用栈实现队列
队列做到的是先进先出,栈做到的是先进后出。
如何用栈做到先进先出呢?

我们这里使用两个栈,一个栈只负责入队,一个栈只负责出队。

当队列有入队操作的时候,直接压入(入队)栈。
当队列有出队操作的时候,首先判断(出队)栈是否为空,如果为空将(入队)栈的所有元素导入(出队)栈,此时由于(入队)栈本身是先进后出的,到了(出队)栈中,最先进的元素反而在最上面,直接pop即可;如果判断(出队)栈不为空,也是直接pop即可。
如下图所示:
在这里插入图片描述
在这里插入图片描述
所以判断队列是否为空,就是判断两个栈是否都为空即可。

发布了392 篇原创文章 · 获赞 326 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/No_Game_No_Life_/article/details/104512108