LeetCode 155.最小栈&&牛客 栈的压入、弹出序列

本文详细介绍了如何实现一个最小栈,确保在常数时间内获取栈内的最小元素,以及如何判断栈的压入、弹出序列是否合法。通过具体的解题思路和代码实现,阐述了在数据结构中栈的基本操作和应用。对于最小栈,关键在于维护一个额外的最小栈以保存最小值。而对于栈的压入、弹出序列的合法性检查,需要逐个比较入栈和出栈序列,确保顺序正确。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1. 最小栈

难度 中等 OJ链接
在这里插入图片描述
解题思路
这道题不是单单的实现一个栈,最重要的是在常数时间取最小元素的栈
错误思路:
成员变量为一个普通栈和一个min(来记录最小的值):
在这里插入图片描述
如果是这样的话,我们来看一下有什么问题:
在这里插入图片描述
我们入栈一个5,那么最小值就是5。
在这里插入图片描述
入栈的数比_min大就不变。
在这里插入图片描述
入栈的数比_min小就更新。
那么这样有什么问题呢?如果我们pop一下呢?
在这里插入图片描述
此时栈里的最小值就不是2,而是5。那么我们就不好在常数时间内寻找到最小值。
正确思路:
定义一个普通的栈和一个最小栈:
在这里插入图片描述
按照上面的数来看一下流程:
在这里插入图片描述
第一个数是5,两者都需要入栈。
在这里插入图片描述
第二个是7,7比5小,_minst不需要入栈。第三个是8,_minst不需要入栈。
在这里插入图片描述
第四个是2,两个都需要入栈。
在这里插入图片描述
假如,我们再入一个2呢?两个还是需要入栈。
在这里插入图片描述
这样的话,当我们去pop时。当pop的值和_minst的栈顶元素一样时就都删除,不一样_minst就不删。

代码实现:
构造函数,我们不需要写,因为编译器自己会生成一个,然后会去调用自定义类型的构造函数来完成构造。
在这里插入图片描述
push函数,当_minst栈为空和入栈的值小与_minst的top值时就入。
在这里插入图片描述
pop函数,当pop的值和_minst的栈顶元素一样时就都删除,不一样_minst就不删。
在这里插入图片描述
剩下两个就很简单了。
在这里插入图片描述

2. 栈的压入、弹出序列

难度 中等 OJ链接
在这里插入图片描述
解题思路
我们先看这个例子:
在这里插入图片描述
1.入栈序列先入栈。每次入栈以后,栈顶和出栈序列比较
2.不能匹配,有两个方面
a.这个数据可能还没入栈,继续入栈
b.入栈序列已经走到尾,说明数据一定在栈中,但是顺序不对,出栈序列违法

在这里插入图片描述
前三个数都和4不匹配,一直入栈。当我们在入栈下一个数时,匹配了。又该做什么呢?
在这里插入图片描述
3.能匹配,出栈,出栈序列往后走,再和栈顶元素比较
在这里插入图片描述
然后我们在将出栈序列和栈顶元素比较。不匹配,入栈下一个。
在这里插入图片描述
此时,能匹配,出栈,出栈序列往后走。
在这里插入图片描述
然后我们在将出栈序列和栈顶元素比较,匹配,出栈,出栈序列往后走。
在这里插入图片描述
匹配,出栈,出栈序列往后走。一直下去。
在这里插入图片描述
当入栈序列结尾了,栈里为空,或者出栈序列结尾了,说明出栈序列合法的。
我们再来看一下不合法的
在这里插入图片描述
匹配,出栈,出栈序列往后。
在这里插入图片描述
匹配,出栈,出栈序列往后。
在这里插入图片描述
不匹配,入栈下一个元素。
在这里插入图片描述
匹配,出栈,出栈序列往后。
在这里插入图片描述
不匹配,但是入栈序列已经入完,数据全在栈中。但是出栈序列没有到尾,栈不为空,所以是不合法的。

代码实现:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值