我正在尝试将Stack传递给一个方法,然后创建一个临时的重复堆栈并操纵副本以查看它是否已排序。我已经尝试了所有我能想到的东西,但是出于某种原因,如果我在运行isSorted方法之前打印堆栈,它会按预期打印。如果我运行isSorted方法并打印传入的堆栈,则它是空的。
请参阅以下代码块:
public static boolean isSorted(Stack<RailwayCar> parkingArea) {
Stack<RailwayCar> tempStack = parkingArea;
boolean isSorted = true;
while (!tempStack.isEmpty()) {
int tempValue = tempStack.pop().getSerialNumber();
if (!tempStack.isEmpty() && tempValue > tempStack.peek().getSerialNumber()) {
isSorted = false;
}
}
return isSorted;
}
答案 0 :(得分:1)
您不是在复制堆栈,而是创建另一个指向堆栈的指针。 tempStack和parkingArea都指向同一个对象。要创建副本,请使用.clone()方法。
Stack<RailwayCar> tempStack = parkingArea.clone();
编辑:如果你需要自己实现克隆方法,那么在第三个堆栈的帮助下它很简单。沿着以下伪代码的行:
clone():
copy = new Stack;
helper = new Stack;
while not this.is_empty():
helper.put(this.pop());
while not helper.is_empty():
item = helper.pop();
copy.put(item);
this.put(item);
return copy;
我们正在倒转堆栈并在逆转时克隆每个元素。
请注意,这将创建一个浅表副本。如同,复制将指向相同的项目。要获得更深层次的副本,您必须实现item.clone并调用以下内容:
copy.put(item.clone())
而不是
copy.put(item)