LinkedStack 并显示整个堆栈

我在这些问题上遇到了困难。我有 4 个问题要让它工作。我得到其中两个是正确的,但另外两个是错误的。这是一个toString()用于java的:


    LLNode<T> node = top;

    StringBuilder s = new StringBuilder();

    String es = "Empty Stack";


    if (node == null)

    {

        return es;

    }

    s.append("bottom|");

    while (node != null)

    {

        s.append(node.getInfo());

        s.append("|");

        node = node.getLink();


    }

    s.append("top");

    return s.toString();

}

它返回:


bottom|3|4|5|top代替bottom|5|4|3|top


我的另一个错误是它返回:


bottom|5|4|3|2|1|top代替bottom|1|2|3|4|5|top


如果有人知道如何做到这一点,那就太好了。我被困住了,我不知道为什么它没有返回我想要的东西。


这就是它想要的


@Test  

public void test_toString_on_a_stack_with_multiple_elements() {


    stk1.push(5); stk1.push(4); stk1.push(3);


    Assert.assertEquals("bottom|5|4|3|top", stk1.toString());

}   


@Test  

public void test_toString_on_a_full_stack() {


    stk1.push(1); stk1.push(2); stk1.push(3); stk1.push(4); stk1.push(5);


    Assert.assertEquals("bottom|1|2|3|4|5|top", stk1.toString());

}   


一只名叫tom的猫
浏览 89回答 2
2回答

慕桂英546537

在 kai 的答案中使用StringBuilder.insertas 可以使代码正确,但对于大型堆栈来说很慢。类似的方法是先将元素存储在一个列表中,然后将列表反转,最后从列表中生成整个字符串。这是代码:public String toString() {&nbsp; &nbsp; if (top == null) {&nbsp; &nbsp; &nbsp; &nbsp; return "Empty Stack";&nbsp; &nbsp; }&nbsp; &nbsp; List<String> elements = new ArrayList<>();&nbsp; &nbsp; elements.add("top");&nbsp; &nbsp; for (LLNode<T> node = top; node != null; node = node.getLink()) {&nbsp; &nbsp; &nbsp; &nbsp; elements.add(String.valueOf(node.getInfo()));&nbsp; &nbsp; }&nbsp; &nbsp; elements.add("bottom");&nbsp; &nbsp; elements.reverse();&nbsp; &nbsp; return String.join("|", elements);}我没有测试上面的代码,但我相信它可以工作。很好,您已经有了可用的测试。在教育环境中,上述代码可能是不可接受的。这是因为 List 在概念上比 Stack 更复杂。因此,该列表可能尚未在课堂上涵盖。通常,主题的复杂性越来越高,因此列表可能会使用堆栈,但反之则不然。在实际编程中,上面的代码虽然可以。

函数式编程

根据您的发布,打印元素的顺序是错误的。因此,一种解决方案是预先添加到 StringBuilder 而不是附加。由于索引 0 让生活更轻松,我还移动了“bootom|” 在收集所有节点并将其添加到缓冲区中的所有节点输出之前:LLNode<T> node = top;&nbsp; &nbsp; StringBuilder s = new StringBuilder();&nbsp; &nbsp; String es = "Empty Stack";&nbsp; &nbsp; if (node == null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return es;&nbsp; &nbsp; }&nbsp; &nbsp; while (node != null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; s.insert(0, "|");&nbsp; &nbsp; &nbsp; &nbsp; s.insert(0, node.getInfo());&nbsp; &nbsp; &nbsp; &nbsp; node = node.getLink();&nbsp; &nbsp; }&nbsp; &nbsp; s.insert(0,"bottom|");&nbsp; &nbsp; s.append("top");&nbsp; &nbsp; return s.toString();}(这是未经测试的,写在我的头上,因为我没有你的 LLNode 或任何东西 - 所以尽最大努力)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java