一. 题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
二. 思路
准备一个stack
,用于入栈push(x)
和出栈pop()
;再准备一个minStack
,用于保存当前栈中的最小元素。
当进行push(x)
操作的时候,将元素放入stack
中,如果minStack
此时为空,说明x
是当前最小元素,那就将x
放入到minStack
中;如果此时minStack
不为空,那就将x
与minStack
栈顶最小元素进行比较,如果minStack
栈顶元素更小,那就不放x
将栈顶最小元素再一次放入到minStack
中。
当进行pop()
操作的时候,从stack
中弹出栈顶元素,此时也将minStack
的栈顶元素弹出。其实就是撤销了上一步的push(x)
操作。
三: 代码实现
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int x) {
stack.push(x);
// minStack始终入栈的元素都是最小值
if(minStack.isEmpty() || x<= minStack.peek()){
minStack.push(x);
}else{
minStack.push(rStack.peek());
}
}
public void pop() {
if(!stack.isEmpty()){
// 一起弹出栈顶元素
stack.pop();
minStack.pop();
}
return -1;
}
public int top() {
return stack.peek();
}
public int min() {
// 说明栈里没有元素
if(stack.isEmpty()){
return 0;
}
return minStack.peek();
}
}