Конструктор Stack <> реверсирует стек при инициализации из другого? - PullRequest
6 голосов
/ 21 июля 2010

Вот код:

var s = new Stack<int>();
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);

var ns = new Stack<int>(s);
var nss = new Stack<int>(new Stack<int>(s));

и посмотрим результат

        tbLog.Text += "s stack:";
        while(s.Count > 0)
        {
            tbLog.Text += s.Pop() + ",";
        }
        tbLog.Text += Environment.NewLine;
        tbLog.Text += "ns stack:";
        while (ns.Count > 0)
        {
            tbLog.Text += ns.Pop() + ",";
        }

        tbLog.Text += Environment.NewLine;
        tbLog.Text += "nss stack:";
        while (nss.Count > 0)
        {
            tbLog.Text += nss.Pop() + ",";
        }

производит следующий вывод:

s stack:4,3,2,1,

ns stack:1,2,3,4,

nss stack:4,3,2,1,

Таким образом, стек ns возвращается * стек 1011 *, а стек nss совпадает со стеком s.

Ответы [ 3 ]

13 голосов
/ 21 июля 2010

Конструктор стека, который принимает IEnumerable<T>, включает элементы, как если бы Add вызывался несколько раз.

Итерации по стеку итерируют в «попсовом» порядке ... поэтому, когда вы создаете один стек из другого, он сначала добавит вершину исходного стека, а затем поместит элемент «второй сверху» поверх этого в новом стеке и т. д. ... фактически полностью изменив его.

3 голосов
/ 21 июля 2010

Ключ к вашему удивлению находится в вашем вопросе:

Может ли конструктор Stack <> перевернуть стек при инициализации из другого ?

Ктор, на который вы ссылаетесь, не принимает другой Stack - скорее, он принимает IEnumerable.То есть, нет особого подхода к построению Stack из Stack, по сравнению с построением Stack из любого другого IEnumerable.

Так что когда вы пытаетесь построить Stack из Stack, источник Stack потребляется в своем естественном порядке перечисления, то есть в порядке popping .И новый Stack создается путем толкания пунктов входящих IEnumerable.Отсюда и поведение, которое вы видите.

3 голосов
/ 21 июля 2010

Конструктор, который вы используете для ns и nss, равен Stack<T>(IEnumerable<T>). Когда вы перечисляете стек, он перечисляет сверху вниз. Но при создании стека элементы помещаются в перечисляемом порядке. Таким образом, последний перечисляемый элемент (последний в источнике) будет вершиной нового стека.

Так что да, это меняет порядок элементов.

...