试题:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
代码:
为了实现栈的功能,我们可以简单的利用java Stack来存储数据,但题目要求实现一个O(1)的求栈内最小值的函数,显然直接利用stack求解无法达到要求,这就需要我们在入栈时已经将最小值求得,在出栈时直接返回。栈存在一个特点是所有数据都是按照入栈顺序排列的,那么我们可以记录一个从栈底到栈中某位置所有数值的最小值序列,提前将最小值都记录下来。如下:
栈 3,4,2,5,1
辅助栈 3,3,2,2,1
import java.util.Stack;
public class Solution {
private Stack<Integer> stack1 = new Stack<Integer>();
private Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
if( stack2.empty() ){
stack2.push(node);
}else if( node <= stack2.peek() ){ //注意等号,对出栈有影响
stack2.push(node);
}
}
public void pop() {
if( stack1.peek() == stack2.peek() ){ //如果stack1的出栈值已经到达stack2标定的当前最小值位置,stack2同时出栈。
stack2.pop();
}
stack1.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}