题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
我们的第一反应可能是每次压入一个新元素进栈时,将栈里的元素排序,让最小的元素位于栈顶,这样能在O(1)时间内,但这样不能保证最后压入栈的元素最先出栈,这样的数据结构已经不是栈了。
接着我们可以想到保存最小的元素,但是当最小的元素被弹出后,如何得到下一个最小的元素?
我们可以在定义一个辅助栈,每次把最小的元素保存在辅助栈中。
例如:压入数字3,3现在为最小值,同时压入数据栈和辅助栈中,接着往数据栈中压入4,4比3大,所有仍然往辅助栈中压入3。
接着往数据栈中压入2,2比3小,辅助栈中压入2。。。
由于每次都把最小元素压入辅助栈,就能保证辅助栈顶一直都是最小元素,当最小元素从数据栈中弹出后,同时弹出辅助栈顶元素,此时辅助栈顶的下一个元素就是最小值。
import java.util.Stack;
/**
* @author yuan
* @date 2019/2/14
* @description
*/
public class 包含min函数的栈 {
/**
* 数据栈
*/
private Stack<Integer> dataStack = new Stack<>();
/**
* 辅助栈min
*/
private Stack<Integer> minStack = new Stack<>();
public void push(int node) {
dataStack.push(node);
if (minStack.isEmpty() || node < minStack.peek()) {
minStack.push(node);
} else {
minStack.push(minStack.peek());
}
}
public void pop() {
if (!dataStack.isEmpty() && !minStack.isEmpty()) {
dataStack.pop();
minStack.pop();
}
}
/**
* 获取数据栈顶的元素,不弹出
* @return
*/
public int top() {
return dataStack.peek();
}
/**
* 获取min站顶的元素,不弹出
* @return
*/
public int min() {
return minStack.peek();
}
}