Стек Stack в C#

Стек — это структура данных (коллекция, последовательность), содержащая один или несколько элементов одного типа и работающая по принципу 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>.
CopyTo(T[], Int32) Копирует Stack<T> в существующий одномерный массив Array, начиная с указанного индекса массива.
Peek() Возвращает объект, находящийся в начале Stack<T>, без его удаления.
Pop() Удаляет и возвращает объект, находящийся в начале Stack<T>.
Push(T) Вставляет объект как верхний элемент стека Stack<T>.
ToArray() Копирует Stack<T> в новый массив.
TrimExcess() Устанавливает емкость равной фактическому количеству элементов в 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}");
            }
        }
    }
}

Результат работы приложения будет следующий:

Количество элементов коллекции 0
Извлекли из стека значение 5. Всего элементов 4
Извлекли из стека значение 4. Всего элементов 3
Нашли в стеке значение 3. Всего элементов 3
Извлекли из стека значение 3. Всего элементов 2
Извлекли из стека значение 2. Всего элементов 1
Извлекли из стека значение 1. Всего элементов 0

Итого

Сегодня мы рассмотрели реализацию ещё одной структуры данных в C# — стек. Стек работает по принципу LIFO — последний добавленный элемент выводится (удаляется) из коллекции первым.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии