【问题标题】:How can I copy a stack by using a temporary stack?如何使用临时堆栈复制堆栈?
【发布时间】:2021-12-25 05:13:24
【问题描述】:

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

```
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]

【问题讨论】:

    标签: copy stack


    【解决方案1】:

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

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

    这是一个单独的问题,但是对于 Java,您应该尝试使用参数化类型,例如 Stack&lt;Integer&gt;Stack&lt;T&gt;/Stack&lt;E&gt;(任何类型/任何元素的堆栈),以便编译器可以检查您的代码类型安全并帮助避免运行时错误。这有点冗长,但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;
      }
    }
    

    【讨论】:

    • 是的,没问题!另外,我刚刚意识到,在具有该函数的版本中,do-while 循环可能应该只是一个 while 循环,所以如果您尝试复制一个空堆栈(偷看一个空堆栈会引发异常),您不会收到错误)。
    猜你喜欢
    • 2021-09-03
    • 2021-11-02
    • 2012-07-19
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2022-10-17
    • 2021-05-20
    相关资源
    最近更新 更多