题目描述:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解题思路:用两个栈实现最小栈,一个dataStack栈用于保存元素,另一个minStack栈用于保存最小值。入栈时: 先将需要入栈的元素入到dataStack中,此时若minStack为空或者需要入栈的元素小于等于minStack栈顶 的元素,则将该元素入到minStack中。出栈时:如果dataStack和minStack的栈顶元素相等,则minStack的栈顶元素出栈,否则dataStack的栈顶元素出栈。获取栈顶元素:返回dataStack的栈顶元素。检索栈中的最小元素:返回minStack的栈顶元素。
代码如下:
import java.util.Stack;
public class MinStack {
Stack<Integer>dataStack;
Stack<Integer>minStack;
public MinStack() {
dataStack = new Stack();
minStack = new Stack();
}
//入栈
public void push(int x){
//数据每次向数据栈中入一个
dataStack.push(x);
//最小栈空或者元素小于最小栈的栈顶元素,则最小栈入一个元素
if(minStack.isEmpty()||x<=minStack.peek()){
minStack.push(x);
}
}
//出栈
public void pop(){
if(dataStack.peek().equals(minStack.peek())){
minStack.pop();
}
dataStack.pop();
}
//获取栈顶元素
public int top(){
return dataStack.peek();
}
//获取最小值
public int getMin(){
return minStack.peek();
}
}