【问题标题】:Pop values off Stack<T> [duplicate]从 Stack<T> 弹出值 [重复]
【发布时间】:2018-01-25 16:08:35
【问题描述】:

所以我正在尝试使用堆栈创建一个回溯递归算法来生成迷宫,以存储输入到 ints [x,y] 数组中的最后一个点的坐标。当我尝试将 .Pop 的结果从堆栈中存储出来时,它会将我的变量设置为第一个弹出的值,而不是下一个弹出的值。

    public static void Main(string[] args)
    {
        //Your code goes here
        Stack<int[]> myStack = new Stack<int[]>();

        int[] pusher = new int[] {1,2};
        myStack.Push(pusher);

        pusher[0] = 3;
        pusher[1] = 4;
        myStack.Push(pusher);

        while(myStack.Count > 0){
            int[] test = myStack.Pop();
            for(int i = 0; i < test.Length; i++){
                Console.WriteLine(test[i]);
            }
        }
    }

想要的结果是控制台显示 3,4,1,2。相反,我会返回 3,4,3,4。

【问题讨论】:

  • 您正在重用同一个数组实例,因此实际上您将同一个数组推入堆栈两次。当您将 3 和 4 存储到数组中时,您会覆盖已经存在的 1 和 2。 Push 不复制数组内容,只复制数组引用,因此您将同一个数组推送两次。如果要推送副本,请使用myStack.Push(pusher.ToArray());
  • 我会为存储的对象定义一个类而不是一个数组。由于您推送的对象是一个点的坐标,因此您只需要一个 X 和 Y 值。不是开放式整数数组。如果我正确阅读了您的问题
  • 谢谢你,@LasseVågsætherKarlsen!我明白了。
  • 理解引用类型的标准失败。请参阅标记的重复项。

标签: c# arrays stack


【解决方案1】:

您只创建一个数组 - pusher。然后,您只需分别替换该数组的索引 0 和 1 处的数字 1 和 2。

如果你创建另一个数组并将 3 和 4 添加到这个数组中,你会得到预期的结果:

Stack<int[]> myStack = new Stack<int[]>();

int[] pusher = new int[] { 1, 2 };
myStack.Push(pusher);

int[] second = new int[2];
second[0] = 3;
second[1] = 4;
myStack.Push(second);

while (myStack.Count > 0)
{
    int[] test = myStack.Pop();
    for (int i = 0; i<test.Length; i++)
    {
        Console.WriteLine(test[i]);
    }
}

【讨论】:

  • 这暂时是一个解决方案,但问题是在实际情况下我不只使用 2 个坐标。我正在与数百人合作......
  • 你的意思是什么?您仍然无法覆盖这些值并期望能够弹出它们...
  • 我的意思是创建数百个变量是不切实际的。在我的问题上查看 cmets。 Lasse 似乎答对了。
  • ToArray() 创建另一个数组,就像我的示例中的 int[] second = new int[2] 一样,所以我真的不明白你的意思。并且必须更加“实用”,不要覆盖您希望保留的值。
【解决方案2】:

Lasse Vågsæther Karlsen 在 cmets 中回答的问题。移动来回答。:

您正在重用同一个数组实例,因此实际上您将同一个数组推入堆栈两次。当您将 3 和 4 存储到数组中时,您会覆盖已经存在的 1 和 2。 Push 不会复制数组内容,仅复制数组引用,因此您将相同的数组推送两次。如果要推送副本,请使用 myStack.Push(pusher.ToArray()); – Lasse Vågsæther Karlsen 4 小时前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2023-03-06
    • 2015-07-01
    相关资源
    最近更新 更多