You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:双队列实现栈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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:34:05