我创建一个堆栈数组并初始化第一个元素:
Stack[] snowmen = new Stack[numberOfOperations+1];
snowmen[0] = new Stack();
然后我遍历数组并想要执行两件事:
代码:
for(int i = 1; i <= numberOfOperations; i++)
{
. . .
else if (addSnowball == 0)
{
snowmen[i] = new Stack();
snowmen[i] = snowmen[copySnowmanNr];
snowmen[i].Pop();
}
else
{
snowmen[i] = new Stack();
snowmen[i] = snowmen[copySnowmanNr];
snowmen[i].Push(addSnowball);
}
. . .
}
如果我现在调用push或pop方法,我的数组中的每个堆栈都将被更改,而不仅仅是第i个堆栈,这可能告诉我我的副本都指向相同的存储位置。我是对的,我做错了什么,我该怎么办?
感谢您的帮助,flame inc:X
答案 0 :(得分:1)
你是正确的,因为你指的是同一个堆栈。以下行将对copySnowmanNr
索引的堆栈引用复制到i
索引。
snowmen[i] = snowmen[copySnowmanNr];
要创建实际堆栈的副本,请执行以下操作:
snowmen[i] = new Stack(snowmen[copySnowmanNr]);
正如其他人所说,你的snowmen[i] = new Stack();
陈述是不必要的。
编辑:正如OP在他的回答中指出的,上面创建了一个反向堆栈。这是因为它通过简单地迭代旧的来构建新的。有一个克隆方法,它以正确的顺序创建堆栈的浅表副本:
snowmen[i] = (Stack)snowmen[copySnowmanNr].Clone();
答案 1 :(得分:0)
如果其他人可能遇到同样的问题,我想添加一些内容:
如果你像问题的答案那样做:
snowmen[i] = new Stack(snowmen[copySnowmanNr]);
新堆栈的项目是相反的,我刚刚发现我可以解决这个问题:
snowmen[i] = (Stack)snowmen[copySnowmanNr].Clone();
我不知道为什么我必须使用Stack进行打字,如果不是会出现错误,我认为这与“对象”类型的堆栈项有关。