题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
CODE
import java.util.Stack;
import java.util.Arrays;
/*思路:利用一个辅助栈来存放最小值
栈 3,4,2,5,1
辅助栈 3,3,2,2,1
每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶
当出栈时,辅助栈也要出栈
这种做法可以保证辅助栈顶一定都当前栈的最小值
*/
public class Solution {
private int size; // 栈指针始终是在下一个空位置的地方
private int min = Integer.MAX_VALUE;
private Stack<Integer> minStack = new Stack<>(); // 辅助栈
private Integer[] elements = new Integer[10]; // 模拟栈结构,超过10就进行扩容
private void ensureCapacity(int size){
int len = elements.length;
if(size > len){ // 如果存不下,就扩容。
int newLen = len * 2;
elements = Arrays.copyOf(elements,newLen);
// Arrays 类的 copyOf() 方法的语法格式如下:Arrays.copyOf(dataType[] srcArray,int length);
}
}
public void push(int node) { //入栈时维护辅助栈
ensureCapacity(size+1); // 判断这个这个值能否装下,若当前容器装不下就需要扩容
elements[size++] = node; // 入栈
if(node <= min){
minStack.push(node); // 若node结点比最小值还小,则更新最小值,并进栈
min = minStack.peek(); // 更新最小值
}else{
minStack.push(min);
}
}
public void pop() { // 出栈,可以先调用top,若top不为,则说明栈不为空,可以出栈
Integer top = top();
if(top != null){
elements[size-1] = (Integer) null; // 将出栈后的位置赋空
}
size--;
minStack.pop();
min = minStack.peek(); // 更新最小值
}
public int top() { // 取栈顶元素,但是不出栈
if(!empty()){
if(size-1 >= 0)
return elements[size-1];
}
return (Integer) null;
}
private boolean empty(){
return size == 0;
}
public int min() {
return min;
}
}