一、问题描述
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
二、问题分析
入栈、出栈、取栈顶元素都是普通的栈操作,只有getMin()是新添加的操作,并且要求在常量时间内完成。显然我需要一个额外的数据结构来存储到序列i的最小值,因为涉及到出栈操作把当前的最小值给pop出去,那么这时候应该保存到j的最小值,显然这个“额外的数据结构”不止存一个元素,并且还能进行普通的栈操作。因此我可以额外添加一个栈,只用来保存最小值序列,相应的我需要在pop、push的时候处理额外栈,getMin的时候可以返回top元素(constant time),之前也说过,push操作在额外的栈中需要时刻保证栈顶元素是最小值。具体的看代码。
三、Java AC代码
class MinStack {
private LinkedList<Integer> stack = new LinkedList<Integer>();
private LinkedList<Integer> minStack = new LinkedList<Integer>();
public void push(int x) {
stack.push(x);
if (minStack.isEmpty()||minStack.peek()>=x) {
minStack.push(x);
}
}
public void pop() {
int popEle = stack.pop();
if (popEle==minStack.peek()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}