copy - 如何使用临时堆栈复制堆栈?
问题描述
这是我作为初学者的代码,我想实现图片中显示的想法。有没有更好的改进方法?
``` 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]
解决方案
是的,这是复制堆栈的好方法。不错的解决方案!for
我确实认为通过在循环中迭代你有一个小错误i < StackLength - 1
:这应该是i < StackLength
因为如所写,你不会到达 originalStack 的最后一个元素,也不会将它推送到 TempStack,所以它不会出现在复制堆栈。originalStack.size() == 0
您可以通过循环直到像在循环中所做的那样,对这种类型的一对一错误进行更具防御性的编码do-while
。
风格方面,您可以通过包含更多空格来改进代码(似乎任何给定行中的所有内容都尽可能紧密地压缩在一起,这通常不像它应该的那样可读),您可能应该使用驼峰式大小写tempStack
和stackLength
保持一致(您通常为类保留首字母大写的名称)。您甚至可以包装您的代码以将堆栈复制到函数中。
这是一个单独的问题,但是对于 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;
}
}