我在解决这些问题上有困难。我有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());
}
答案 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);
}
我没有测试上面的代码,但是我相信它可以工作。很好,您已经有可用的测试。
在教育环境中,以上代码可能不可接受。这是因为列表在概念上比堆栈要复杂。因此,该列表可能尚未在课堂上涉及。通常,主题的复杂性会不断增加,因此列表可能会使用堆栈,但反之则不行。在实际编程中,上面的代码还是可以的。