实现一个栈,该栈带有出栈(pop)、入栈(push)和取最小元素(getMin)3个方法。3个方法时间复杂度都是O(1)。
以{4,9,7,3,8,5}入栈为例。下图两个栈,第一个栈stack1用来存储所有元素,第二栈stack2用来存储最小元素。
- 对于入栈(push)操作,当第一个元素4入stack1栈时,同时入stack2栈。在后续元素入stack1时,与stack2的栈顶元素比较,若该元素小于栈顶元素,则表明该元素更小,入stack2栈,否则不入栈。如图,9和7比4大,不入stack2栈,3比4小,入stack2栈。
- 对于出栈(pop)操作,若出栈的元素同时也是stack2栈的栈顶元素,则stack2的栈顶元素也出栈。
- 对于取最小元素(getMin)操作,返回stack2的栈顶元素。
public class MinStack {
private Stack<Integer> stack1 = new Stack<>();
private Stack<Integer> stack2 = new Stack<>();
private int pop() throws Exception{
throwException();
//出栈元素也是stack2的栈顶元素
if (stack1.peek().equals(stack2.peek())){
stack2.pop();
}
return stack1.pop();
}
private void push(int item){
if (stack2.empty()){
stack2.push(item);
}else {
//入栈元素比stack2的栈顶元素更小,如stack2栈
if (stack2.peek() > item){
stack2.push(item);
}
}
stack1.push(item);
}
private int getMin() throws Exception{
throwException();
return stack2.peek();
}
private void throwException() throws Exception{
if (stack1.empty()){
throw new Exception("栈中元素为空");
}
}
public static void main(String[] args) throws Exception{
MinStack minStack = new MinStack();
minStack.push(4);
minStack.push(9);
minStack.push(7);
minStack.push(3);
minStack.push(8);
minStack.push(5);
System.out.println(minStack.getMin()); //3
System.out.println(minStack.pop()); //5
System.out.println(minStack.pop()); //8
System.out.println(minStack.pop()); //3
System.out.println(minStack.getMin()); //4
System.out.println(minStack.pop()); //7
System.out.println(minStack.pop()); //9
System.out.println(minStack.pop()); //4
}
}