将用户创建的Stack传递给方法时,传入的堆栈已更改

时间:2017-12-02 10:59:27

标签: java methods stack

我正在尝试将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;
    }

1 个答案:

答案 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)