2013-03-14 94 views
3

我正在一个堆栈的链表实现,似乎有我需要的只有一个错误。我插入3个字符串,但在第三个字符串被弹出之前,我得到一个NullPointerException。链接列表堆栈丢失堆栈上的最后一项推出

在运行调试时,我发现这个缺失的值正在从该列表中“弹出”,但它似乎没有被计数......意味着它从堆栈中丢失,未打印到控制台,在最后一个值已被弹出的情况下,抛出NullPointerException异常的一次迭代。有人能告诉我如何让我所有的价值观打印到控制台吗?

这里是我的LinkedListStack类:

public class LinkedListStack <T>{ 
private LinkedListStackNode<T> top; 
public T data; 

class LinkedListStackNode<T> {   
    private T data;  //LINE 8 
    private LinkedListStackNode<T> next; 

    public LinkedListStackNode(T data, LinkedListStackNode<T> next) {      
     this.data = data;    
     this.next = next; 
    } 
} 
public void stack(){ 
    top = null; 
} 
public boolean isEmpty(){ 
    return top == null; 
} 
public void push (T t){ 
    top = new LinkedListStackNode<T> (t, top); 
} 
public T pop(){ 
    if (isEmpty()){ 
     System.out.println("The stack is empty!"); 
    } 
    else{ 
     top = top.next; 
    } 
    return top.data; //Line 32 
} 
public T peek(){ 
    if (isEmpty()){ 
     System.out.println("Stack is Empty"); 
    } 
    return top.data;   
} 
} 

这里是我的主要():

public class StacksAndQsMain { 
    public static void main(String[] args) { 
      ...snipped code to condense (not part of this implementation)... 

    //LinkedList Implementation 
    LinkedListStack<String> lls = new LinkedListStack<>(); 

    String s3 = "Tonight"; //this does not print but is removed from Stack 
    String s4 = "We Conqure"; //prints fine 
    String s5 = "Stacks"; //prints fine 

    lls.push(s5); 
    lls.push(s4); 
    lls.push(s3); 

    while (!lls.isEmpty()){ 

     System.out.println(lls.pop()); //LINE 32 
    } 
} 
} 

回答

4

看来你大跌眼镜顶掉,然后在弹出阅读新的顶部的值()方法

它应该是这样的:

public T pop(){ 
    if (isEmpty()){ 
     throw new RuntimeException("Stack is empty"); 
    } 
    else{ 
     T ret = top.data; 
     top = top.next; 
     return ret; 
    } 
} 

当你在这,你还不如解决您的PEEK()

public T peek(){ 
    if (isEmpty()) { 
     throw new RuntimeException("Stack is empty"); 
    } 
    return top.data;   
} 
+0

让我怎么解决这个问题? – Chris 2013-03-14 02:05:53

+2

添加程式码 – 2013-03-14 02:07:30

+0

非常感谢! 'ret'是短的,还是只是你选择的字母? – Chris 2013-03-14 02:10:17