使用递归交换两个栈的元素:临时变量初始化问题排查
问题分析与解决
你的代码核心问题有两个:
- 临时变量作用域错误:
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] } }
逻辑说明
- 递归终止条件:当两个栈都为空时,停止递归。
- 递归阶段:依次弹出两个栈的顶部元素并保存,直到两个栈被清空。
- 回溯阶段:把从
s2弹出的元素推入s1,把从s1弹出的元素推入s2,最终实现两个栈元素的完全交换。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

