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 或任何東西 - 所以盡最大努力)
添加回答
舉報