我试图实现一个堆栈,除了提供标准的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
。有人可以帮我理解我在这里做错了什么。
答案 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也可以帮助您。