如何使用临时栈复制栈?新手编写的实现代码有什么优化方案?
代码优化方案
首先梳理现有代码的可改进点:
- 变量名拼写错误:你定义的变量是
originalStack,后续调用时写成了orginalStack,缺少字母i,会直接导致编译报错 - 边界风险:如果原栈为空,执行
originalStack.peek()时会抛出空栈异常,现有逻辑没有兼容空栈场景 - 代码规范问题:Java变量命名遵循小驼峰规则,
TempStack、StackLength不符合规范,且循环体没有加大括号,后续新增代码容易出现逻辑错误 - 逻辑可进一步简化,无需单独处理栈顶元素的特殊判断
优化思路
你的核心思路是正确的:通过临时栈倒转元素两次,保证复制后的栈和原栈顺序完全一致,且不破坏原栈的结构。我们可以把逻辑简化为两次全量倒栈,既降低理解成本,也能兼容空栈场景:
- 把原栈所有元素全部弹出压入临时栈,此时临时栈是原栈的倒序,原栈为空
- 遍历弹出临时栈的所有元素,每弹出一个元素,同时压回原栈、压入目标复制栈,遍历完成后原栈恢复,复制栈和原栈顺序完全一致
优化后代码
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
相关产品推荐
相关产品推荐

