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

如何使用临时栈复制栈?新手编写的实现代码有什么优化方案?

代码优化方案

首先梳理现有代码的可改进点:

  • 变量名拼写错误:你定义的变量是originalStack,后续调用时写成了orginalStack,缺少字母i,会直接导致编译报错
  • 边界风险:如果原栈为空,执行originalStack.peek()时会抛出空栈异常,现有逻辑没有兼容空栈场景
  • 代码规范问题:Java变量命名遵循小驼峰规则,TempStack、StackLength不符合规范,且循环体没有加大括号,后续新增代码容易出现逻辑错误
  • 逻辑可进一步简化,无需单独处理栈顶元素的特殊判断
优化思路

你的核心思路是正确的:通过临时栈倒转元素两次,保证复制后的栈和原栈顺序完全一致,且不破坏原栈的结构。我们可以把逻辑简化为两次全量倒栈,既降低理解成本,也能兼容空栈场景:

  1. 把原栈所有元素全部弹出压入临时栈,此时临时栈是原栈的倒序,原栈为空
  2. 遍历弹出临时栈的所有元素,每弹出一个元素,同时压回原栈、压入目标复制栈,遍历完成后原栈恢复,复制栈和原栈顺序完全一致
优化后代码
import java.util.Stack;

public class StackCopy {
    public static void main(String[] args) {
        // 用泛型保证类型安全,变量采用小驼峰命名
        Stack<Integer> originalStack = new Stack<>();
        Stack<Integer> tempStack = new Stack<>();
        Stack<Integer> copiedStack = new Stack<>();

        originalStack.push(1);
        originalStack.push(2);
        originalStack.push(3);
        originalStack.push(9);
        int stackLength = originalStack.size();

        // 第一步:全量将原栈元素压入临时栈
        for (int i = 0; i < stackLength; i++) {
            tempStack.push(originalStack.pop());
        }

        // 第二步:弹出临时栈元素,同时压回原栈和复制栈
        while (!tempStack.isEmpty()) {
            Integer current = tempStack.pop();
            originalStack.push(current);
            copiedStack.push(current);
        }

        System.out.println("Stack 1 " + originalStack);
        System.out.println("Stack temp " + tempStack);
        System.out.println("Stack 2 " + copiedStack);
    }
}
补充说明
  • 上述优化后的代码时间复杂度为O(n),空间复杂度为O(n),是仅使用栈基础操作(push/pop/peek/size)场景下的最优解法
  • 如果没有算法场景限制,Java的Stack类实现了Cloneable接口,可以直接调用copiedStack = (Stack<Integer>) originalStack.clone()完成复制,代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:09