将对象推入堆栈

pushing object to stack

我的堆栈有问题。我正在尝试实施回溯来解决 peg 纸牌难题。我无法正确地将对象推送到堆栈。当使用 pop() 时,它总是 return 同一个对象。我尝试创建一个简单的 java 应用程序,这是我的代码:

Try s = new Try();
Integer x;

s.x=0;
mark.push(s);
s.x=1;
mark.push(s);
s.x=2;
mark.push(s);

while(!mark.isEmpty()){
    s= (Try) mark.pop();
    x = s.x;
    System.out.println(x.toString());
}

Try 只包含一个 public Integer 变量。 表明: 2个 2个 2

而不是 2个 1个 0

发生这种情况是因为您只有一个 Try class 实例被放入堆栈 3 次。因此显示了最后一个值 (2)。

为每个 push() 创建一个不同的 Try 实例

如前所述,您将 Try 的一个实例推送了三次,但这里有一个更简单的场景来证明这一点:

public static void main(String[] args) {
    List<Test> list = new ArrayList<>();
    Test test = new Test();
    test.x = 1;
    list.add(test);
    test.x = 2;
    list.add(test);
    test.x = 3;
    list.add(test);
    System.out.println(list.stream().map(c -> new Pair<>(c.x, c == test)).collect(Collectors.toList()));
}

private static class Test {
    int x;
}

输出 [3=true, 3=true, 3=true] - 它们都是同一个对象,因此具有相同的值。

推送(或在我的示例中添加)对象只是传递对该对象的引用。您还拥有对该对象的引用;修改任何一个都会改变两者。如果你想解决这个问题,每次都创建 Try 的新实例。