时间复杂度O(1) 空间复杂度O(n)
Stack
class MinStack {
private Stack<Integer> s1,s2;
/** initialize your data structure here. */
public MinStack() {
s1=new Stack<Integer>();
s2=new Stack<Integer>();
}
public void push(int x) {
//向栈1中压入x
s1.push(x);
//如果x小于等于栈2的栈顶,将x压入栈2
//这里一定要小于等于,而不是小于!!
if((s2.isEmpty())||(x<=s2.peek()))
s2.push(x);
}
public void pop() {
//如果栈1的栈顶元素等于栈2的栈顶元素,栈2的栈顶元素出栈
Integer y=s1.pop();
if(y.equals(s2.peek()))
s2.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
LinkedList
class MinStack {
private LinkedList<Integer> s1,s2;
/** initialize your data structure here. */
public MinStack() {
s1=new LinkedList<Integer>();
s2=new LinkedList<Integer>();
}
public void push(int x) {
//向栈1中压入x
s1.addFirst(x);
//如果x小于等于栈2的栈顶,将x压入栈2
if((s2.isEmpty())||(x<=s2.peekFirst()))
s2.addFirst(x);
}
public void pop() {
//如果栈1的栈顶元素等于栈2的栈顶元素,栈2的栈顶元素出栈
Integer y=s1.removeFirst();
if(y.equals(s2.peekFirst()))
s2.removeFirst();
}
public int top() {
return s1.peekFirst();
}
public int min() {
return s2.peekFirst();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/