问题描述
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求:
1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构
实现思路
思路大概就是用两个栈,一个栈用于自定义栈的弹出,压入,辅助栈用于存放最小值,当压入第一个栈的时候,会判断辅助栈是否为空,如果为空也压入,如果不为空,就比较,如果小于等于辅助栈的第一个值,就压入。弹出操作,如果第一个栈弹出的数和辅助栈的第一个数相等,也弹出辅助栈的第一个数,getMin()获取辅助栈的顶部的数据就好。
代码实现
import java.util.Stack;
public class Code_GetMinStack{
public static class GetMinStack{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public GetMinStack() {
stackData = new Stack<Integer>();
stackMin = new Stack<Integer>();
}
public void push(Integer obj) {
stackData.push(obj);
if(stackMin.isEmpty()) {
stackMin.push(obj);
}else {
if(obj >= stackMin.peek()) {
stackMin.push(stackMin.peek());
}else {
stackMin.push(obj);
}
}
}
public Integer pop() {
if(stackData.isEmpty()) {
throw new RuntimeException("stack is empty");
}
stackData.pop();
return stackMin.pop();
}
public Integer getMin() {
if(stackData.isEmpty()) {
throw new RuntimeException("stack is empty");
}
return stackMin.peek();
}
}
public static void main(String[] args) {
GetMinStack getMinStack = new GetMinStack();
getMinStack.push(10);
System.out.println(getMinStack.getMin());
getMinStack.push(9);
System.out.println(getMinStack.getMin());
getMinStack.push(8);
System.out.println(getMinStack.getMin());
getMinStack.push(7);
System.out.println(getMinStack.getMin());
getMinStack.push(6);
System.out.println(getMinStack.getMin());
getMinStack.push(5);
System.out.println(getMinStack.getMin());
getMinStack.pop();
System.out.println(getMinStack.getMin());
getMinStack.pop();
System.out.println(getMinStack.getMin());
}
}