首页 > 解决方案 > 如何使用临时堆栈复制堆栈?

问题描述

这是我作为初学者的代码,我想实现图片中显示的想法。有没有更好的改进方法?

```
Stack originalStack=new Stack();
Stack TempStack=new Stack();
Stack copiedStack=new Stack();

orginalStack.push(1);
orginalStack.push(2);
orginalStack.push(3);
orginalStack.push(9);
int StackLength=orginalStack.size();
  
for(int i=0;i<StackLength-1;i++)
TempStack.push(originalStack.pop());


copiedStack.push(originalStack.peek());
 
do
{
copiedStack.push(TempStack.peek());
originalStack.push(TempStack.peek());
TempStack.pop();
}while(TempStack.size()!=0);

 System.out.println("Stack 1 "+originalStack);
 System.out.println("Stack temp "+TempStack);
 System.out.println("Stack 2 "+copiedStack);
```][1]

标签: copystack

解决方案


是的,这是复制堆栈的好方法。不错的解决方案!for我确实认为通过在循环中迭代你有一个小错误i < StackLength - 1:这应该是i < StackLength因为如所写,你不会到达 originalStack 的最后一个元素,也不会将它推送到 TempStack,所以它不会出现在复制堆栈。originalStack.size() == 0您可以通过循环直到像在循环中所做的那样,对这种类型的一对一错误进行更具防御性的编码do-while

风格方面,您可以通过包含更多空格来改进代码(似乎任何给定行中的所有内容都尽可能紧密地压缩在一起,这通常不像它应该的那样可读),您可能应该使用驼峰式大小写tempStackstackLength保持一致(您通常为类保留首字母大写的名称)。您甚至可以包装您的代码以将堆栈复制到函数中。

这是一个单独的问题,但是对于 Java,您应该尝试使用参数化类型,例如Stack<Integer>or Stack<T>/ Stack<E>(任何类型/任何元素的堆栈),以便编译器可以检查您的代码的类型安全性并帮助避免运行时错误。这有点冗长,但Java就是这样。普通的、未参数化的集合(“原始类型”)更多是最好避免的遗留特性。如果这只是你还没有做到的事情,别担心,你很快就会做到的。

所以这就是我如何修饰事情

import java.util.Stack;

public class CopyStack {
  public static void main(String[] args) {
    Stack<Integer> originalStack = new Stack<>();
    originalStack.push(1);
    originalStack.push(2);
    originalStack.push(3);
    originalStack.push(9);

    Stack<Integer> copiedStack = copyStack(originalStack);

    System.out.println("Stack 1 " + originalStack);
    System.out.println("Stack 2 " + copiedStack);
  }

  public static <T> Stack<T> copyStack(Stack<T> originalStack) {
    Stack<T> tempStack = new Stack<>();
    Stack<T> copiedStack = new Stack<>();

    while (originalStack.size() != 0) tempStack.push(originalStack.pop());

    do {
      copiedStack.push(tempStack.peek());
      originalStack.push(tempStack.peek());
      tempStack.pop();
    } while (tempStack.size() != 0);

    return copiedStack;
  }
}

推荐阅读