C#Stack Array,Push方法将值推送到所有条目

时间:2017-03-30 02:57:11

标签: c# arrays push pop

我创建一个堆栈数组并初始化第一个元素:

Stack[] snowmen = new Stack[numberOfOperations+1];
snowmen[0] = new Stack();

然后我遍历数组并想要执行两件事:

  • 将堆栈从特定索引复制到数组的第i个位置
  • 从新的第i个堆栈中推送/弹出一个整数

代码:

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

2 个答案:

答案 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进行打字,如果不是会出现错误,我认为这与“对象”类型的堆栈项有关。