求助:双队列实现栈push/pop方法时打印输出异常问题
解决用两个队列实现栈时打印输出异常的问题
嘿,我完全懂你的处境!你已经成功用两个队列实现了栈的push(x)和pop()方法,内部测试也确认功能正常,但直接打印栈对象时却出现了类似@15db9742的奇怪输出,而且查到的解决方案大多只针对字符串类,不知道怎么适配自己的栈实现对吧?
为什么会出现这种奇怪输出?
你看到的@xxxxxx其实是Java中Object类默认toString()方法的输出格式:类名@哈希码的十六进制表示。当你直接打印一个对象时,JVM会自动调用这个默认方法,所以就出现了这种看起来像内存地址的内容,而不是你期望的栈内元素列表。
如何重写toString()适配你的栈实现?
核心思路是:遍历栈中的元素,把它们拼接成易读的字符串格式,同时要保证遍历过程不破坏栈的原有结构(毕竟栈是后进先出的,不能因为打印就把元素弄没了)。
假设你的栈类名为MyStack,内部用两个队列q1和q2存储元素(这里假设q1是当前存放栈元素的主队列),可以这样重写toString():
import java.util.LinkedList; import java.util.Queue; public class MyStack { private Queue<Integer> q1; private Queue<Integer> q2; public MyStack() { q1 = new LinkedList<>(); q2 = new LinkedList<>(); } // 你的push方法 public void push(int x) { q2.offer(x); while (!q1.isEmpty()) { q2.offer(q1.poll()); } Queue<Integer> temp = q1; q1 = q2; q2 = temp; } // 你的pop方法 public int pop() { return q1.poll(); } // 重写toString方法 @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Stack: ["); int elementCount = q1.size(); // 遍历主队列q1的元素,同时临时转移到q2 for (int i = 0; i < elementCount; i++) { Integer element = q1.poll(); sb.append(element); if (i != elementCount - 1) { sb.append(", "); } q2.offer(element); } // 把q2的元素移回q1,恢复栈的原始结构 while (!q2.isEmpty()) { q1.offer(q2.poll()); } sb.append("]"); return sb.toString(); } public static void main(String[] args) { MyStack stack = new MyStack(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack); // 现在会输出:Stack: [3, 2, 1] stack.pop(); System.out.println(stack); // 输出:Stack: [2, 1] } }
额外说明
- 如果你的栈是泛型类(比如
MyStack<T>),只需要把代码中的Integer换成T即可,只要泛型参数T对应的类本身重写了toString()(比如String、Integer这些常用类都已经实现),就能正确显示元素内容;如果是自定义类,记得给自定义类也重写toString()哦。 - 重写
toString()不仅能解决打印问题,还能让你在调试时更直观地看到栈的状态,替代那些临时加的打印语句,更符合编码规范。
内容的提问来源于stack exchange,提问作者MaxV
相关产品推荐
相关产品推荐

