定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
思路:两个栈,一个作为数据栈,一个时最小值的栈。每一个最小值栈的每个位置的值代表着这个位置到栈底的最小值。
在数据栈入栈时,也=入最小值栈,两种情况,第一种,比最小值栈的栈顶值小,最小值栈入栈值为新值。第二种情况,比最小值栈的栈顶值大,最小值栈入栈值为最小值栈的栈顶。
代码实现如下:
class MinStack {
/** initialize your data structure here. */
Stack<Integer> dataStack,minStack;
public MinStack() {
//数据栈
dataStack=new Stack<>();
//最小值栈
minStack=new Stack<>();
}
public void push(int x) {
//思路:最小栈跟数据栈一样长,最小栈记录每一步的最小值
//顺序再插入的时候做好
//为空或者比最小的还小,存最小值的栈入栈
if( minStack.isEmpty()){
//最小值栈为空,入栈
minStack.push(x);
}else if(x<minStack.peek()){
//比最小值栈的栈顶还小,新值入栈
minStack.push(x);
}else{
//比最小值栈的栈顶还大,拿最小值栈的栈顶入栈
minStack.push(minStack.peek());
}
//数据入数据栈
dataStack.push(x);
//这样数据栈跟最小值栈就是已经排序好的
}
public void pop() {
minStack.pop();
dataStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
}