将堆栈推入另一个堆栈

rya*_*an0 8 .net c# stack

在C#中,有没有办法将一个堆栈推送到另一个堆栈而不迭代堆栈元素?如果没有,我应该使用更好的数据结构吗?在Java中,您可以:

stack1.addAll(stack2)
Run Code Online (Sandbox Code Playgroud)

我希望找到C#模拟......

aqu*_*nas 3

0.安全解决方案-扩展方法

public static class Util {
        public static void AddAll<T>(this Stack<T> stack1, Stack<T> stack2) {
            T[] arr = new T[stack2.Count];
            stack2.CopyTo(arr, 0);

            for (int i = arr.Length - 1; i >= 0; i--) {
                stack1.Push(arr[i]);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

也许最好的方法是创建一个扩展方法。请注意,我将第一个堆栈放在另一个堆栈的“顶部”,可以这么说,通过从 arr.Length-1 到 0 循环。所以这段代码:

  Stack<int> x = new Stack<int>();
  x.Push(1);
  x.Push(2);

  Stack<int> y = new Stack<int>();
  y.Push(3);
  y.Push(4);          

  x.AddAll(y);
Run Code Online (Sandbox Code Playgroud)

将导致 x 为:4,3,2,1。如果您按下 1、2、3、4,这就是您所期望的结果。当然,如果您要循环遍历第二个堆栈并实际弹出元素,然后将它们推入第一个堆栈,则最终会得到 1,2,4,3。再次,根据需要修改 for 循环。或者您可以添加另一个参数来指定您想要的行为。我手边没有Java,所以我不知道他们是做什么的。

话虽如此,你可以这样做,但我不保证它会继续有效。当调用 ToList 时,MS 总是可以更改堆栈工作方式的默认行为。但是,这更短,并且在我的.NET 4.5 机器上的工作方式与上面的扩展方法相同:

1行Linq解决方案:

y.Reverse().ToList().ForEach(item => x.Push(item));
Run Code Online (Sandbox Code Playgroud)