Stack\<T> - это структура данных, представляющая коллекцию объектов, которые хранятся в формате LIFO (Last-In-First-Out), то есть "последний вошёл - первый вышел". Stack\<T> может быть очень полезен, когда вам нужна временная коллекция объектов, которую вы хотите просмотреть в обратном порядке, например, при обходе дерева или графа в глубину (DFS). Вы не можете получить доступ к элементам по индексу, потому что Stack\<T> реализует интерфейсы IEnumerable\<T>, ICollection, IEnumerable, а не ICollection\<T> или IList\<T>. <br> Вот некоторые основные операции и методы, которые вы можете выполнять с Stack\<T>: * **Push(T item)**: Добавляет объект в вершину стека. Элемент, который был добавлен последним, остаётся на вершине стека. * **Pop()**: Удаляет и возвращает объект с вершины стека. Этот метод выбрасывает InvalidOperationException, если стек пуст. * **Peek()**: Возвращает объект с вершины стека, но не удаляет его. Этот метод также выбрасывает InvalidOperationException, если стек пуст. Обладает константной сложностью O(1), что делает его очень производительным для больших коллекций. * **Count**: Это свойство, которое возвращает количество элементов в стеке. * **Clear()**: Удаляет все объекты из стека. Вот пример использования Stack\<T>: ```csharp var stack = new Stack<int>(); stack.Push(1); // stack: 1 stack.Push(2); // stack: 2, 1 stack.Push(3); // stack: 3, 2, 1 Console.WriteLine(stack.Peek()); // Вывод: 3, stack: 3, 2, 1 Console.WriteLine(stack.Pop()); // Вывод: 3, stack: 2, 1 Console.WriteLine(stack.Pop()); // Вывод: 2, stack: 1 Console.WriteLine(stack.Count); // Вывод: 1 ``` <br> Вы можете использовать foreach для перебора элементов Stack\<T>. Помните, что foreach не удаляет элементы из стека. Если вы хотите удалить элементы по мере их перебора, следует использовать Pop() в цикле while. Вот пример: ```csharp var stack = new Stack<int>(); stack.Push(1); stack.Push(2); stack.Push(3); foreach (var item in stack) { Console.WriteLine(item); } // Вывод: // 3 // 2 // 1 ``` В этом примере мы добавляем числа 1, 2 и 3 в стек, затем перебираем его с помощью foreach. Числа выводятся в порядке, обратном порядку добавления, но они остаются в стеке после перебора. Если вы хотите получить элемент, который был помещен в стек первым (т.е., он сейчас находится в "низу" стека), то вам придется пройти через все элементы стека. Проход через все элементы стека - это операция с линейной сложностью (O(n)), что может быть медленным для больших стеков. К тому же, стандартный объект Stack в C# не предоставляет прямого метода для доступа к нижнему элементу.