题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素min函数。在该栈中调用min、push及pop的时间复杂度都是O(1)。
答案:
借助辅助栈,辅助栈栈顶保留最小值
比如压入5,3,6,2,4
先压入5,辅助栈也压入5.
压入3,由于3比5小,则辅助栈压入3
压入6,由于6比目前辅助栈中的最小值3大,则辅助栈压入3.
压入2,由于2比目前辅助栈中的最小值3小,则辅助栈压入2.
压入4,由于2比目前辅助栈中的最小值2小,则辅助栈压入2.
Stack<Integer> stack = new Stack<>();
//辅助栈
Stack<Integer> minStack = new Stack<>();
public void push(int value) {
stack.push(value);
if (minStack.isEmpty()) {
minStack.push(value);
} else {
if (value < minStack.peek()) {
minStack.push(value);
} else {
minStack.push(minStack.peek());
}
}
}
public int pop() {
if (stack.isEmpty()) {
throw new RuntimeException("栈为空!");
}
minStack.pop();
return stack.pop();
}
public int min() {
return minStack.peek();
}