Стек — это структура данных (коллекция, последовательность), содержащая один или несколько элементов одного типа и работающая по принципу 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 — последний добавленный элемент выводится (удаляется) из коллекции первым.