Java中Stack的pushAtBottom递归实现疑问
递归实现栈底添加元素的原理解析
import java.util.*; //To push an element at the bottom of a stack public class StackProblem1 { public static void pushAtBottom(Stack<Integer> s, int data) { if(s.isEmpty()) { s.push(data); return; } int temp = s.pop(); pushAtBottom(s, data); s.push(temp); } public static void main(String args[]) { Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); pushAtBottom(stack, 4); while(!stack.isEmpty()) { System.out.println(stack.pop()); } } }
我对上述代码中的
pushAtBottom递归方法存在疑问:该方法通过递归调用会弹出栈内所有元素直至栈为空,再添加新数据,但递归调用时temp变量会如何存储?不同递归层级对应的元素1、2、3的temp值会不会被覆盖?执行流程是先清空整个栈添加新数据后再依次放回temp值,还是逐个移动新值并放回temp?我是初学者,已初步理解概念,希望深入了解以明确原理。
一、temp变量的存储逻辑
Java的方法调用依赖**调用栈(Call Stack)**实现,每一次递归调用pushAtBottom,都会在调用栈中生成一个独立的方法帧(Method Frame)。每个方法帧包含该次调用的局部变量(包括temp)、方法参数、返回地址等专属信息。
简单说,每次递归的temp都是当前方法帧里的独立变量,各自存在不同的内存空间,互相独立。
二、不同层级的temp值不会被覆盖
以初始栈[1,2,3](栈底到栈顶)为例:
- 第一次调用
pushAtBottom:弹出3赋值给temp,触发递归 - 第二次调用:弹出2赋值给新的
temp,触发递归 - 第三次调用:弹出1赋值给第三个
temp,触发递归
这三个temp(值分别为3、2、1)分属三个不同的递归方法帧,完全不会互相覆盖,直到对应方法帧执行完毕才会被销毁。
三、完整执行流程
整个过程是先把原栈元素全部弹出暂存到调用栈的方法帧中,栈空时加入新元素,再从最后一次递归返回,依次把暂存元素压回原栈,具体步骤拆解:
- 初始栈:
[1,2,3],调用pushAtBottom(stack,4) - 第一次调用:栈非空,弹出3→
temp=3,递归调用pushAtBottom(stack,4) - 第二次调用:栈非空,弹出2→
temp=2,递归调用pushAtBottom(stack,4) - 第三次调用:栈非空,弹出1→
temp=1,递归调用pushAtBottom(stack,4) - 第四次调用:栈为空,压入4,方法返回
- 回到第三次调用:执行
s.push(temp),压入1,栈变为[4,1],方法返回 - 回到第二次调用:执行
s.push(temp),压入2,栈变为[4,1,2],方法返回 - 回到第一次调用:执行
s.push(temp),压入3,栈变为[4,1,2,3],方法返回 main方法中依次弹出元素,输出顺序为3、2、1、4
本质是利用递归的调用栈做“中转”,暂存原栈元素,从而实现新元素插入栈底的操作。
内容的提问来源于stack exchange,提问作者Dishank Gawas
相关产品推荐
相关产品推荐

