猿问

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

我正在阅读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();

    }


慕勒3428872
浏览 131回答 1
1回答
随时随地看视频慕课网APP

相关分类

Java
我要回答