为了账号安全,请及时绑定邮箱和手机立即绑定

minStack子类,将一个对象用于最小堆栈和常规堆栈

minStack子类,将一个对象用于最小堆栈和常规堆栈

慕勒3428872 2021-04-06 17:15:21
我正在阅读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();    }
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信