为了账号安全,请及时绑定邮箱和手机立即绑定

LinkedStack 并显示整个堆栈

LinkedStack 并显示整个堆栈

一只名叫tom的猫 2022-06-23 09:24:06
我在这些问题上遇到了困难。我有 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());}   
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

在 kai 的答案中使用StringBuilder.insertas 可以使代码正确,但对于大型堆栈来说很慢。类似的方法是先将元素存储在一个列表中,然后将列表反转,最后从列表中生成整个字符串。


这是代码:


public String toString() {

    if (top == null) {

        return "Empty Stack";

    }


    List<String> elements = new ArrayList<>();

    elements.add("top");

    for (LLNode<T> node = top; node != null; node = node.getLink()) {

        elements.add(String.valueOf(node.getInfo()));

    }

    elements.add("bottom");


    elements.reverse();

    return String.join("|", elements);

}

我没有测试上面的代码,但我相信它可以工作。很好,您已经有了可用的测试。


在教育环境中,上述代码可能是不可接受的。这是因为 List 在概念上比 Stack 更复杂。因此,该列表可能尚未在课堂上涵盖。通常,主题的复杂性越来越高,因此列表可能会使用堆栈,但反之则不然。在实际编程中,上面的代码虽然可以。


查看完整回答
反对 回复 2022-06-23
?
函数式编程

TA贡献1807条经验 获得超9个赞

根据您的发布,打印元素的顺序是错误的。因此,一种解决方案是预先添加到 StringBuilder 而不是附加。由于索引 0 让生活更轻松,我还移动了“bootom|” 在收集所有节点并将其添加到缓冲区中的所有节点输出之前:


LLNode<T> node = top;

    StringBuilder s = new StringBuilder();

    String es = "Empty Stack";


    if (node == null)

    {

        return es;

    }

    while (node != null)

    {

        s.insert(0, "|");

        s.insert(0, node.getInfo());

        node = node.getLink();


    }

    s.insert(0,"bottom|");

    s.append("top");

    return s.toString();

}

(这是未经测试的,写在我的头上,因为我没有你的 LLNode 或任何东西 - 所以尽最大努力)


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信