java - minStack 子类使用一个对象作为最小堆栈和常规堆栈
问题描述
我正在阅读 CTCI 的书,发现这个答案令人困惑。目标是创建一个堆栈数据结构,可以在 O(1) 中推送、弹出和 min(获取堆栈中的最小元素)。我编写了一个有两个堆栈的类,一个用于保存最小值,一个用作常规堆栈。代码如下。据我所知,这适用于测试。
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 可视化器中查看此内容仅显示一个堆栈对象,该对象显然存储了两个不同的堆栈。这个实现有效,但我不确定为什么。澄清将不胜感激!
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();
}
解决方案
推荐阅读
- xcode - 输入通用约束时 Xcode 崩溃
- c# - ASP.NET Core ADO.net 中的自定义 ConfigurationProvider
- pip - 使用 pip3 在 Centos7 上安装 ansible
- docusignapi - 如何在 DocuSign 中使用刷新令牌
- reactjs - 如何在点击事件处理程序中使用 `useSelector()` 的值?
- python - 如何在 python 中使用 ffmpeg 映射字节(内存文件)?
- haskell - Haskell:从“类型”转移到“数据”
- c++ - 仅在 c++ 不起作用的情况下从具有整数类型的结构中读取和写入
- xamarin - Azure.Identity 在 Xamarin.iOS 平台上引发未实现的异常
- javascript - JavaScript 从对象中选择一部分变量