要求时间复杂度为O(1), 思路是准备两个栈,一个原数据栈,一个用于存放最小值得辅助栈,每次入栈时,都比较当前入栈的元素与辅助栈栈顶的元素,若比辅助栈栈顶元素小,则压入辅助栈,若比辅助栈栈顶元素大,则辅助栈继续压入它的栈顶元素。最后,辅助栈的栈顶元素一定为目前所压入栈的最小元素。
code:
import java.util.Stack;
public class StackWithGetMin { //实现找出栈中最小数
public static class stackMin{
private Stack<Integer> stackData; //原栈
private Stack<Integer> stackMin;// 用来存放最小数的辅助栈
public stackMin() {
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
public void push(int obj) {
if(this.stackMin.isEmpty()) { //辅助栈为空则压入元素
this.stackMin.push(obj);
}else if(obj <= this.getMin()) {// 新加入的元素小于等于辅助栈的栈顶元素 则压入
this.stackMin.push(obj);
}else { //新加入的元素大于辅助栈栈顶元素 则 继续压入辅助栈顶元素
int minObj = this.stackMin.peek();
this.stackMin.push(minObj);
}
this.stackData.push(obj); //常规压栈
}
public int pop() {
if(this.stackMin.isEmpty()) {
throw new RuntimeException("stack is empty");
}
this.stackMin.pop();
return this.stackData.pop();
}
public int getMin() {
if(this.stackMin.isEmpty()) {
throw new RuntimeException("the stackMin is empty");
}
return this.stackMin.peek();
}
}
}