我正在阅读CTCI的书,发现这个答案令人困惑。目标是创建一个堆栈数据结构,该结构可以在O(1)中推送,弹出和最小化(获取堆栈中的最小元素)。我编写了一个具有两个堆栈的类,一个用于保存最小值,一个用作常规堆栈。代码如下。据我所知,这可以通过测试来完成。
public static class StackWithMin extends Stack<Integer>{
Stack<Integer> stack;
Stack<Integer> minStack;
public StackWithMin(){
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int value){
if(value <= min()){
minStack.push(value);
}
stack.push(value);
}
public Integer pop(){
int value = stack.pop();
if(value == min()){
minStack.pop();
}
return value;
}
public int min(){
if(minStack.isEmpty()){
return Integer.MAX_VALUE;
}
return minStack.peek();
}
}
但是,书中给出的答案对我来说并不完全清楚。我已经用Java学习了两门课程,但是用了C语言学习了最后两门,所以我的OOP概念有些生锈。该类中只有一个堆栈字段,并使用super调用更新“常规”堆栈,并使用s2调用更新最小堆栈。在Java visualizer中查看此内容仅显示一个堆栈对象,该对象显然存储了两个不同的堆栈。此实现有效,但是我不确定为什么。澄清将不胜感激!
public class Q2 /* MinStack */ extends Stack<Integer> {
private Stack<Integer> min = new Stack<Integer>();
public void push(int item) {
if (min.isEmpty() || item < min()) {
min.push(item);
}
super.push(item);
}
public Integer pop() {
int item = super.pop();
if (item == min()) {
min.pop();
}
return item;
}
public Integer min() {
return min.peek();
}
相关分类