LinkedStack并显示整个堆栈

时间:2019-02-16 02:36:08

标签: java

我在解决这些问题上有困难。我有4个问题可以使它正常工作。我为此选择了两个,但另外两个是错误的。它是Java的toString()

    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 个答案:

答案 0 :(得分:1)

基于您的过帐,元素的打印顺序是错误的。因此,一种解决方案是在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或其他任何东西-所以请尽力而为)

答案 1 :(得分:1)

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

这是代码:

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

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

在教育环境中,以上代码可能不可接受。这是因为列表在概念上比堆栈要复杂。因此,该列表可能尚未在课堂上涉及。通常,主题的复杂性会不断增加,因此列表可能会使用堆栈,但反之则不行。在实际编程中,上面的代码还是可以的。