我在这些问题上遇到了困难。为了让它工作,我有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());
} 发布于 2019-02-16 21:20:34
使用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);
}我没有测试上面的代码,但我相信它可以工作。好消息是你已经有了可用的测试。
在教育环境中,上面的代码可能是不可接受的。这是因为List在概念上比Stack更复杂。因此,这个列表可能还没有在课堂上讲到。通常,主题是通过不断增加的复杂性来覆盖的,因此列表可能使用Stack,但不是反过来。但在实际编程中,上面的代码应该没问题。
https://stackoverflow.com/questions/54719337
复制相似问题