【问题标题】:Linked List Stack Loses Last Item Pushed on Stack链表堆栈丢失最后一个推入堆栈的项目
【发布时间】:2023-04-03 02:25:01
【问题描述】:

我正在研究一个 Stack 的链表实现,并且似乎只有一个错误有我需要的东西。我正在插入 3 个字符串,但在弹出第 3 个字符串之前,我得到了 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;        
}  
}

这是我的 Main():

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
    }
}
}

【问题讨论】:

    标签: java linked-list stack


    【解决方案1】:

    看来您正在弹出顶部,然后在 pop() 方法中读取新顶部的值

    应该是这样的:

    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;        
    }  
    

    【讨论】:

    • 非常感谢! 'ret' 是某物的缩写还是只是您选择的字母?
    • ret 是 returnValue 的缩写
    • 几分钟前我才想到这个,谢谢你的帮助。我接受了你的建议并添加了例外。
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2013-12-26
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多