不需要自己手写实现一个栈,可以使用Stack来完成栈操作,关键点在于常数时间内能检索到最小值,需要使用辅助存储最小值。
这个辅助存储的特点:如果入栈的时候的值比栈里面所有元素都小(或者相等),需要记录下这个值,如果后面这个值出栈了,记录里面也要删除这个值,如果这个值没出栈,那么这个值前面的元素的值肯定比这个值大;具有最近相关性,使用栈来存储
public class MinStack {
//内部栈,存储元素
Stack<Integer> innerStack;
//存储最小值的栈
Stack<Integer> minValueStack;
/** initialize your data structure here. */
public MinStack() {
innerStack = new Stack<>();
minValueStack = new Stack<>();
}
public void push(int x) {
innerStack.push(x);
if(minValueStack.isEmpty() || x<=minValueStack.peek()) {
minValueStack.push(x);
}
}
public void pop() {
int popValue = innerStack.pop();
if(popValue==minValueStack.peek()) {
minValueStack.pop();
}
}
public int top() {
return innerStack.peek();
}
public int getMin() {
return minValueStack.peek();
}
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
System.out.println(minStack.getMin()); //--> 返回 -3.
minStack.pop();
System.out.println(minStack.top()); //--> 返回 0.
System.out.println(minStack.getMin()); //--> 返回 -2.
}
}
这里有个小问题,如果minValueStack为空,minValueStack.peek()会返回空指针异常;但是并不影响通过
类似的问题还有:
使用栈来实现队列:可以使用两个栈来解决
使用队列来实现栈:可以用两个队列来解决