题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度是O(1)。
分析:
我们需要一个辅助栈,每次向栈中放数据的时候,同时向辅助栈中放当前栈中的min元素,同时,在弹出栈的时候,也在辅助栈中将当前的min元素弹出,这样可以获取到弹出栈后的次小元素。
解法:
package com.wsy;
import java.util.Stack;
class StackWithMin extends Stack {
private Stack<Integer> stack;
private Stack<Integer> stackWithMin;
public StackWithMin() {
stack = new Stack();
stackWithMin = new Stack();
}
public Object min() {
return stackWithMin.peek();
}
@Override
public Object push(Object item) {
if (stackWithMin.isEmpty() || (Integer) item < stackWithMin.peek()) {
stackWithMin.push((Integer) item);
} else {
stackWithMin.push(stackWithMin.peek());
}
return stack.push((Integer) item);
}
@Override
public synchronized Object pop() {
stackWithMin.pop();
return stack.pop();
}
}
public class Main {
public static void main(String[] args) {
StackWithMin stackWithMin = new StackWithMin();
stackWithMin.push(3);
System.out.println(stackWithMin.min());
stackWithMin.push(4);
System.out.println(stackWithMin.min());
stackWithMin.push(2);
System.out.println(stackWithMin.min());
stackWithMin.push(1);
System.out.println(stackWithMin.min());
stackWithMin.pop();
System.out.println(stackWithMin.min());
stackWithMin.pop();
System.out.println(stackWithMin.min());
stackWithMin.push(0);
System.out.println(stackWithMin.min());
}
}