文章目录
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.能匹配,出栈,出栈序列往后走,再和栈顶元素比较
然后我们在将出栈序列和栈顶元素比较。不匹配,入栈下一个。
此时,能匹配,出栈,出栈序列往后走。
然后我们在将出栈序列和栈顶元素比较,匹配,出栈,出栈序列往后走。
匹配,出栈,出栈序列往后走。一直下去。
当入栈序列结尾了,栈里为空,或者出栈序列结尾了,说明出栈序列合法的。
我们再来看一下不合法的:
匹配,出栈,出栈序列往后。
匹配,出栈,出栈序列往后。
不匹配,入栈下一个元素。
匹配,出栈,出栈序列往后。
不匹配,但是入栈序列已经入完,数据全在栈中。但是出栈序列没有到尾,栈不为空,所以是不合法的。
代码实现: