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

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. 初始栈:[1,2,3],调用pushAtBottom(stack,4)
  2. 第一次调用:栈非空,弹出3→temp=3,递归调用pushAtBottom(stack,4)
  3. 第二次调用:栈非空,弹出2→temp=2,递归调用pushAtBottom(stack,4)
  4. 第三次调用:栈非空,弹出1→temp=1,递归调用pushAtBottom(stack,4)
  5. 第四次调用:栈为空,压入4,方法返回
  6. 回到第三次调用:执行s.push(temp),压入1,栈变为[4,1],方法返回
  7. 回到第二次调用:执行s.push(temp),压入2,栈变为[4,1,2],方法返回
  8. 回到第一次调用:执行s.push(temp),压入3,栈变为[4,1,2,3],方法返回
  9. main方法中依次弹出元素,输出顺序为3、2、1、4

本质是利用递归的调用栈做“中转”,暂存原栈元素,从而实现新元素插入栈底的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:10