题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
时间复杂程度是O(1),说明不能采用遍历的方式去获取最小,何况栈结构不能遍历。
题目要求定义栈结构,意思是定义自己的myStack。
算法思路:图片的表达非常清晰,不再做过多阐述,意思是要建立一个辅助栈来存储最小值。我们的重点应该放在如何构造辅助栈,而pop、push这类的操作交给类库就可以了。
MyStack
public class MyStack {
Stack<Integer> stack = new Stack();
Stack<Integer> minMyStack = new Stack();
// minMyStack的栈顶指针 和 将要插入的元素比较 谁小push哪个
public void push(int value){
stack.push(value);
if(minMyStack.empty()){
minMyStack.push(value);
} else{
if(minMyStack.peek() > value){
minMyStack.push(value);
} else{
minMyStack.push(minMyStack.peek());
}
}
}
// 使stack和minStack里元素的数量保持一致
public int pop(){
minMyStack.pop();
return stack.pop();
}
public int min(){
return minMyStack.peek();
}
}
方法调用
MyStack myStack = new MyStack();
myStack.push(3);
myStack.push(4);
myStack.push(5);
myStack.push(1);
System.out.println(myStack.min());