2 回答
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 更复杂。因此,该列表可能尚未在课堂上涵盖。通常,主题的复杂性越来越高,因此列表可能会使用堆栈,但反之则不然。在实际编程中,上面的代码虽然可以。
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 或任何东西 - 所以尽最大努力)
添加回答
举报