题目:
实现一个栈,该栈带有出栈,入栈,取最小元素3个方法,要保证3个方法的时间复杂度都是O(1);
解题思路:
1.设原有的栈叫做栈A,此时额外创建一个栈B,用于辅助栈A
2.当第一个元素进入栈A时,让新元素也进入栈B,这个唯一的元素就是栈A的当前最小值
3.之后,每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值
每当栈A有元素出栈时,如果出栈元素时站A当前最小值,则让栈B的栈顶元素也出栈,此时栈B余下的栈顶元素所指向的,是栈A当中原本第2 小的元素,代替刚才的出栈元素称为栈A当前最小值
5.当调用getMin方法的时候,返回栈B的栈顶所存储的值,这也是栈A的最小值。
import java.util.Stack;
public class getMinStack {
private Stack<Integer> mainStack = new Stack<Integer>();
private Stack<Integer> minStack = new Stack<Integer>();
//入栈
public void push(int element){
mainStack.push(element);
//如果辅助站为空,或则新元素小于或者等于辅助栈栈顶,则将新元素压入栈
if(minStack.empty() || element <= minStack.peek()){
minStack.push(element);
}
}
//出栈
public Integer pop(){
//如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈
if(mainStack.peek().equals(minStack.peek())){
minStack.pop();
}
return mainStack.pop();
}
//获取最小元素
public int getMin() throws Exception{
if(mainStack.empty()){
throw new Exception("stack is empty");
}
return minStack.peek();
}
public static void main(String[] args) throws Exception{
getMinStack stack = new getMinStack();
stack.push(4);
stack.push(9);
stack.push(7);
stack.push(3);
stack.push(8);
System.out.println(stack.getMin());
stack.pop();
stack.pop();
System.out.println(stack.getMin());
}
}