定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
题目表述:利用栈来实现得到最小元素的栈
题解
- 利用栈来实现入栈,出栈,得到栈顶元素,得到栈的入栈元素
- 利用一个栈来实现以上功能,核心是使用双入栈来保存最小值
- 定义一个栈和一个最小值,最小值初始化为栈的最大值
- 那么得到栈顶元素和返回最小值就很简单了
- 核心是入栈和出栈
- 入栈(双入栈):如果入栈的值比小于或等于当前最小值,那么先将原先的最小值入栈,最后再将当前值入栈
- 如果当前出栈的元素是最小值,则再次出栈,并将该值设置为 min
class MinStack {
Stack<Integer> stack;
int min;
public MinStack() {
stack = new Stack<>();
min = Integer.MAX_VALUE;
}
// 如果是最小值,则双入栈
public void push(int x) {
if(x <= min){
// 先将原先的最小值入栈
stack.push(min);
min = x;
}
// 再将现在的最小值入栈
stack.push(x);
}
// 如果出栈的是 min,则把下一个出栈的设为新的min
public void pop() {
if(stack.pop()==min){ // 查看元素是不是最小值
min = stack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return min;
}
}