题目
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
分析
栈的特点是先进后出,所以要求min的时间复杂度是1,就必须将最小的元素时刻放在栈顶,那么我们考虑每次压栈的时候,将当前要压栈的元素和栈中所有元素进行比较, 最小的放在栈顶。这样是可以满足min函数的要求,但是这个数据结构就不是栈了,因为不能保证先进后出。
那么我们考虑在栈中设置一个变量保存最小的元素,但是,加入我们将最小的元素出栈,那么第二小的元素是什么呢?就不知道了。
所以考虑,用一个辅助栈去存储最小的元素。 假如我们将3、4、2、1进行入栈操作。
首先,入栈3:
主栈和辅助栈都是空,直接入栈。
入栈4,4不是最小的,所以主栈入栈4,而辅助栈入栈3,始终保持栈顶元素最小,并且两个栈的元素个数相等。
入栈2,主栈直接压栈,辅助栈2是最小的,放在最顶层:
同理可得1入栈的结果如下图所示:
那么我们来看看min函数,在这个函数中,我们调用stack的peek()函数,这个函数的作用是读取栈顶的元素,而不做其他改变。
而进行pop()操作的时候,主栈和辅助栈都必须进行pop操作。
代码
import java.util.Stack;
public class Solution {
// 主栈
Stack<Integer> mainStack = new Stack<>();
// 辅助栈
Stack<Integer> helpStack = new Stack<>();
public void push(int node) {
mainStack.push(node);
if (helpStack.isEmpty()) {
helpStack.push(node);
}else{
int miniTemp = helpStack.peek();
if (miniTemp >= node) {
helpStack.push(node);
}else{
helpStack.push(miniTemp);
}
}
}
public void pop() {
mainStack.pop();
helpStack.pop();
}
public int top() {
return mainStack.peek();
}
public int min() {
return helpStack.peek();
}
}