包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
具体实现
解题思路:创建一个辅助栈,用来储存每次入栈时的栈里元素的最小值,数据每压栈或出栈一次,辅助栈也要压栈或出栈一次。这样可以保持当前辅助栈的栈顶的值必定是元素中的最小值。
import java.util.Stack;
import java.util.Arrays;
public class Solution {
private Integer[] elements = new Integer[10];
private Stack<Integer> minstack = new Stack<Integer>();//辅助栈
private int size;
private int min = Integer.MAX_VALUE;
public void push(int node) {
ensureCapacity(size+1);//扩容
elements[size++] = node;//入数据栈
if(node <= min) {//当前值小于栈内的最小值
minstack.push(node);
min = node;
}else {//当前值不是最小值
minstack.push(min);
}
}
//模拟栈的扩容
public void ensureCapacity(int size) {
int len = elements.length;
if(size > len) {
int newlen = (len*3)/2;//1.5倍扩容
elements = Arrays.copyOf(elements, newlen);
}
}
//出栈
public void pop() {
Integer top = top();//top为当前栈顶元素
if(top != null) {
elements[size-1] = (Integer)null;//置栈顶元素为null
}
size--;//出栈
minstack.pop();//辅助栈也要出栈
min = minstack.peek();//最小值变为辅助栈的栈顶
}
public int top() {
if(size != 0) {//判断栈里是否有元素
if(size - 1 >= 0)
return elements[size - 1];
}
return 0;
}
public int min() {
return min;//因为每一步操作都有更新最小值min,所以直接返回即可
}
}