Стек — это структура данных (коллекция, последовательность), содержащая один или несколько элементов одного типа и работающая по принципу LIFO («last in — first out», «последний вошел — первый вышел»).
В C# стек представляет класс обобщенный класс Stack<T>
. Вывод элементов стека происходит в обратном порядке (принцип LIFO), в то время, как используя очередь (Queue
) вывод элементов происходит в прямом порядке (первый вошел — первый вышел), а, используя список List
, мы можем организовать вывод в любом удобном для нас порядке.
Примеров использования стеков в реальной жизни можно придумать массу — стопка книг, тарелок и так далее. Например, если перед нами стоит стопка тарелок, то, чтобы достать самую нижнюю тарелку (она у нас в стопку попала первой), нам необходимо сначала убрать все тарелки над ней (те, которые были перед ней — последние).
Создание стека в C#
Для создания стека в C# мы можем воспользоваться следующими конструкторами:
Создание пустого стека:
Stack<int> stack = new Stack<int>();
Создание пустого стека заданной емкости:
Stack<int> stack2 = new Stack<int>(10);
здесь мы создали стек с начальной емкостью в десять элементов.
Создание стека из коллекции:
int[] array = new int[] { 1, 2, 3, 4, 5 }; Stack<int> stack3 = new Stack<int>(array);
здесь мы создали стек, используя обычный одномерный массив. В этот конструктор можно передавать любые объекты, реализующие интерфейс IEnumerable
. О том, как реализовать такой интерфейс в своей программе — читайте эту статью.
Методы стека
В таблице ниже представлены основные методы класса Stack<T>
Clear() |
Удаляет все объекты из Stack<T> . |
Contains(T) |
Определяет, входит ли элемент в коллекцию Stack<T> . |
Copy |
Копирует Stack<T> в существующий одномерный массив Array , начиная с указанного индекса массива. |
Peek() |
Возвращает объект, находящийся в начале Stack<T> , без его удаления. |
Pop() |
Удаляет и возвращает объект, находящийся в начале Stack<T> . |
Push(T) |
Вставляет объект как верхний элемент стека Stack<T> . |
To |
Копирует Stack<T> в новый массив. |
Trim |
Устанавливает емкость равной фактическому количеству элементов в Stack<T> , если это количество составляет менее 90 процентов текущей емкости. |
Пример работы со стеком в C#
Рассмотрим простой пример работы со стеком в C#, показывающий использование различных методов класса Stack<T>
using System; using System.Collections.Generic; namespace ConsoleApp7 { internal class Program { static void Main(string[] args) { Stack<int> stack = new Stack<int>(3); //создаем стек с начальной емкостью на 3 элемента Console.WriteLine($"Количество элементов коллекции {stack.Count}"); //добавляем новые элементы в стек stack.Push(1); stack.Push(2); stack.Push(3); stack.Push(4);//на этом шаге емкость хранилища будет увеличена stack.Push(5); while (stack.Count > 0) { if (stack.Peek() == 3) { Console.WriteLine($"Нашли в стеке значение 3. Всего элементов {stack.Count}"); } Console.WriteLine($"Извлекли из стека значение {stack.Pop()}. Всего элементов {stack.Count}"); } } } }
Результат работы приложения будет следующий:
Извлекли из стека значение 5. Всего элементов 4
Извлекли из стека значение 4. Всего элементов 3
Нашли в стеке значение 3. Всего элементов 3
Извлекли из стека значение 3. Всего элементов 2
Извлекли из стека значение 2. Всего элементов 1
Извлекли из стека значение 1. Всего элементов 0
Итого
Сегодня мы рассмотрели реализацию ещё одной структуры данных в C# — стек. Стек работает по принципу LIFO — последний добавленный элемент выводится (удаляется) из коллекции первым.