在Java中返回最小值的堆栈

时间:2016-01-01 03:43:45

标签: java

我试图实现一个堆栈,除了提供标准的push和pop之外,还会在O(1)时间内返回最小值。

这是我的代码。

import java.util.Comparator;
import java.util.Iterator;
import java.util.ListIterator;

public class MinStack<T> {

    private Node head;
    private Node minHead;
    private T minValue;


    private class Node<T extends Comparable<T>>  {
        private T data;
        private Node next;

        public Node(T data){
            this.data = data;
            this.next = null;
        }

        public int compareTo(T other){
            return data.compareTo(other);
        }

    }

    public void push(T item){
        Node p = new Node((Comparable) item);
        if(head == null){
            head = p;
            minHead = p;
            return;
        }
        p.next = head;
        head = p;

        if(((Comparable) item).compareTo(minValue) < 0){
            minValue = item;
            Node m = new Node((Comparable) item);
            m.next = minHead;
            minHead = m;
        }

    }

    public T pop(){
        if(head == null){
            System.out.println("Popping off an empty stack!!!");
            System.exit(-1);
        }
        Node item = (Node) head.data;
        if(item == minValue){
            minHead = minHead.next;
        }
        head = head.next;
        return (T) item;
    }

    public T getMin(){
        return minValue;
    }

    public void trace(){
        Node current = head;
        while(current != null){
            if(current.next == null){
              System.out.println(current.data);
            }else{
                System.out.println(current.data + "->");
            }
            current = current.next;
        }
    }

    public void minTrace(){
        Node current = minHead;
        while(current != null){
            if(current.next == null){
                System.out.println(current.data);
            }else{
                System.out.println(current.data + "->");
            }
            current = current.next;
        }
    }
}

当我使用以下客户端代码时,

MinStack<Integer> stack = new MinStack<>();
        stack.push(12);
        stack.push(1);
        stack.push(7);
        stack.push(9);
        stack.push(3);
        stack.push(2);
        stack.trace();

我在使用compareTo函数比较T值的行上得到null pointer exception。有人可以帮我理解我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

if(head == null){
            head = p;
            minHead = p;
            minValue = //try setting minvalue here
            return;
        }

当只有一个元素时,minValue将等于该元素。

答案 1 :(得分:0)

您收到null pointer exception,因为您的minValue未初始化。在使用之前尝试使用某个默认值进行初始化。

此外,您的意图似乎是从数据结构中找到最低值。在这种情况下,Stack不是一个好的解决方案。我会建议你使用Priority Queue

如果您仍然使用Stack,This link也可以帮助您。