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

使用递归交换两个栈的元素:临时变量初始化问题排查

问题分析与解决

你的代码核心问题有两个:

  • 临时变量作用域错误:temp1和temp2在if代码块内部声明,后续push操作时无法访问这些变量,直接触发编译报错。
  • 空栈场景未处理:当其中一个栈为空时,对应的临时变量未初始化,同样会导致编译失败。

修正思路

将temp1和temp2提升到方法开头声明,用Integer类型(支持null)适配空栈场景;递归阶段先弹出两个栈的所有元素,回溯时将对方栈的元素推入当前栈,完成交换。

修正后的代码

import java.util.Stack;

public class RecursionExchangeElementsStack {

    void exchangeStack(Stack<Integer> s1, Stack<Integer> s2) {
        Integer temp1 = null;
        Integer temp2 = null;

        if (s1.isEmpty() && s2.isEmpty()) {
            return;
        }

        if (!s1.isEmpty()) {
            temp1 = s1.pop();
        }
        if (!s2.isEmpty()) {
            temp2 = s2.pop();
        }

        exchangeStack(s1, s2);

        // 将s2的原元素推入s1
        if (temp2 != null) {
            s1.push(temp2);
        }
        // 将s1的原元素推入s2
        if (temp1 != null) {
            s2.push(temp1);
        }
    }

    public static void main(String[] args) {
        Stack<Integer> s1 = new Stack<>();
        s1.push(1);
        s1.push(2);
        s1.push(3);
        s1.push(4);

        Stack<Integer> s2 = new Stack<>();
        s2.push(5);
        s2.push(6);
        s2.push(7);

        RecursionExchangeElementsStack re = new RecursionExchangeElementsStack();
        re.exchangeStack(s1, s2);
        System.out.println(s1); // 输出 [5, 6, 7]
        System.out.println(s2); // 输出 [1, 2, 3, 4]
    }
}

逻辑说明

  1. 递归终止条件:当两个栈都为空时,停止递归。
  2. 递归阶段:依次弹出两个栈的顶部元素并保存,直到两个栈被清空。
  3. 回溯阶段:把从s2弹出的元素推入s1,把从s1弹出的元素推入s2,最终实现两个栈元素的完全交换。

内容的提问来源于stack exchange,提问作者nik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:45