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

引入

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

具体题目不做赘述。

单调栈

901.股票价格跨度

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

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

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


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

用栈实现队列

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值