min stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

 

 

构建一个最小栈。除了可以实现栈的出栈入栈、返回栈顶元素之外,还可以实现返回最小值。。实现栈的基本功能很简单,只需内部使用一个stack就行,但是要返回最小值就有点小复杂,因为每次出栈可能会影响最小值。。这里使用链表,每个节点中含有最小值信息,每添加一个节点,就将此节点的min设置为当前所有元素的最小值。因为是往表头添加元素,每次添加只需跟表头的节点的min进行比较,将两者最小的放进自己的节点中。

 

class MinStack {
    Node head;
    
    /** initialize your data structure here. */
    public MinStack() {
       
    }
    
    public void push(int x) {
        if(head==null){
            head=new Node(x,x);
        }else{
      //这里是关键,一开始添加节点会将最小值信息放到第一个节点中,然后每次添加一个,会跟前面的节点的最小值比较,将较小的值放进自己节点,
      //这样可以保证表头的节点中存放的是链表中的最小值信息。就算删除表头,下一个节点成为新表头,该节点中存放的剩下节点中的最小值。 head
=new Node(x,Math.min(x,head.min),head); } } public void pop() { head=head.next; } public int top() { return head.val; } public int getMin() { return head.min; } private class Node{ private int val; private int min; private Node next; public Node(int val,int min){ this(val,min,null); } public Node(int val,int min,Node next){ this.val=val; this.min=min; this.next=next; } } } /** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */

 根据上面的思路,也是可以使用栈和数组集合作为辅助,数组集合存放当前及以前元素的最小值。如下面代码,就是使用了一个数组集合,存放每个元素及之前所有元素的最小值。

当pop()时,最小值发生变化,此时只需list中删除最后一个就行。

 

class MinStack {
    Stack<Integer> stack;
   //使用一个数组集合,存放当前元素和之前元素的最小值。这个在每输入一个元素就可以判断了,当删除一个元素时,集合删除最后一个最小值 
   List<Integer> minList;
    public MinStack() {
       stack=new Stack<>();
        minList=new ArrayList<>();
    }
    
    public void push(int x) {
       if(stack.isEmpty()) {
           stack.push(x);
           minList.add(x);
       }else{
           stack.push(x);
           minList.add(Math.min(x,minList.get(minList.size()-1)));
       }
    }
    
    public void pop() {
      if(stack.isEmpty()) return ;
        
        stack.pop();
        minList.remove(minList.size()-1);
    
    }
    
    public int top() {
     return stack.peek();
    }
    
    public int getMin() {
      return minList.get(minList.size()-1);
    }

  
}

 

posted on 2017-12-22 10:51  夜的第八章  阅读(145)  评论(0编辑  收藏  举报

导航