实现一个栈操作,包含入栈push,出栈pop,获取最小值getMin三种方法。且这三种方法的时间复杂度均为O(1)。
算法步骤:
1、设置两个栈结构stack,mainStack作为普通栈完成入栈出栈,minStack作为最小栈记录栈中元素的动态最小值。
2、入栈时如果入栈元素比最小栈记录的值要小则更新最小栈。
3、出栈时如果出栈元素为最小栈记录的值相等则更新最小栈。
4、栈的最小值为最小栈的栈顶元素。
public class MinStack {
//普通栈
Stack<Integer> mainStack = new Stack<>();
//存储mainStack中的最小值,最小栈
Stack<Integer> minStack = new Stack<>();
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(5);
minStack.push(4);
minStack.push(3);
minStack.push(8);
minStack.push(2);
System.out.println(minStack.getMin());
minStack.pop();
minStack.pop();
System.out.println(minStack.getMin());
}
private void push(int element) {
//栈为空或者入栈元素为最小值时,更新最小栈
if (mainStack.empty() || minStack.peek() >= element) {
minStack.push(element);
}
mainStack.push(element);
}
private Integer pop() {
Integer element = mainStack.pop();
//当出栈元素为最小值时更新最小栈
if (minStack.peek().equals(element)) {
minStack.pop();
}
return element;
}
private Integer getMin() {
return minStack.peek();
}
}