C# Стек

Коллекции C#

В C# Stack — это структура данных, работающая по принципу «последним пришел — первым вышел» (LIFO).

Stack подходит для хранения и обработки данных в последовательности, где последний добавленный элемент удаляется первым.

Stack представляет собой коллекцию объектов, работающую по принципу«последним пришел — первым вышел». Когда вам нужен доступ к элементам по принципу «последним пришел — первым вышел», используйте стек. Когда вы добавляете элемент в стек, вызываетсяPushэлемент, а когда удаляете элемент из стека, вызываетсяPopэлемент.

Stack предоставляет две реализации:

  1. необобщённаяStack(System.Collections.Stack): Поддерживает хранение объектов любого типа (требуются операции упаковки и распаковки).
  2. ОбобщенияStack<T>(System.Collections.Generic.Stack<T>): Поддерживает строго типизированные объекты, избегает упаковки и распаковки и повышает производительность.

Возможности Stack:

  • Последним вошёл — первым вышел: Последний элемент, помещённый в стек, извлекается первым.
  • Динамический размер: Ёмкость стека динамически изменяется по мере необходимости.
  • Поддержка обобщений: с помощьюStack<T>Обеспечивает типобезопасность, избегая ошибок преобразования типов.
  • Не потокобезопасен: по умолчаниюStackиStack<T>Ни один из них не является потокобезопасным.

Методы и свойства класса Stack

В таблице ниже перечисленыStackНекоторые общие члены классаСвойство:

Имя атрибутаTypeОписание
CountintПолучает количество элементов в стеке.
SyncRootobjectПолучает объект, используемый для синхронизации доступа к стеку (необобщенному).
IsSynchronizedboolУказывает, синхронизирован ли доступ к стеку (потокобезопасный, всегдаfalse)。
td>Получает число элементов, содержащихся в Stack.

В таблице ниже перечисленыStackНекоторые распространенные члены классаМетоды:

Название методаТип возвращаемого значенияОписание
Операции с элементами
Push(object item)voidПомещает элемент в верхнюю часть стека.
Pop()objectУдаляет и возвращает элемент, находящийся в верхней части стека.
Peek()objectВозвращает элемент, находящийся в верхней части стека, без его удаления.
Clear()voidУдаляет все элементы из стека.
Проверка и копирование
Contains(object item)boolОпределяет, существует ли элемент в стеке.
ToArray()object[]Копирует элементы стека в новый массив (в обратном порядке).
Clone()objectСоздает поверхностную копию текущего стека.
CopyTo(Array array, int index)voidКопирует элементы стека в существующий массив, начиная с указанного индекса.
Поддержка перечислителя
GetEnumerator()IEnumeratorВозвращает перечислитель, используемый для перебора элементов стека.
Потокобезопасность
Synchronized(Stack stack)StackВозвращает потокобезопасную оболочку стека.

Пример

В следующем примере демонстрируется использование стека (Stack).

Необобщенный стек:

Пример

using System;
using System.Collections;

namespace CollectionsApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack st = new Stack();

            st.Push('A');
            st.Push('M');
            st.Push('G');
            st.Push('W');
           
            Console.WriteLine("Текущий стек: ");
            foreach (char c in st)
            {
                Console.Write(c + " ");
            }
            Console.WriteLine();
           
            st.Push('V');
            st.Push('H');
            Console.WriteLine("Следующее значение для извлечения из стека: {0}",
            st.Peek());
            Console.WriteLine("Текущий стек: ");          
            foreach (char c in st)
            {
               Console.Write(c + " ");
            }
            Console.WriteLine();

            Console.WriteLine("Удаление значений ");
            st.Pop();
            st.Pop();
            st.Pop();
           
            Console.WriteLine("Текущий стек: ");
            foreach (char c in st)
            {
               Console.Write(c + " ");
            }
        }
    }
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Current stack: 
W G M A
The next poppable value in stack: H
Current stack: 
H V W G M A
Removing values
Current stack: 
G M A

Обобщённый стек:

Пример

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Stack<int> stack = new Stack<int>();

        // добавить
        stack.Push(10);
        stack.Push(20);
        stack.Push(30);

        // Просмотр верхнего элемента стека
        Console.WriteLine($"Просмотр: {stack.Peek()}"); // Вывод: 30

        // извлечь
        Console.WriteLine($"Извлечение: {stack.Pop()}"); // Вывод: 30

        // Оставшийся стек
        Console.WriteLine("Оставшиеся элементы:");
        foreach (var item in stack)
        {
            Console.WriteLine(item); // Вывод: 20, 10
        }
    }
}

Разница между Stack и Stack<T>

Stack (необобщённый)

  • Хранит объекты какobjectтип.
  • Требует явного приведения типов при использовании, что может вызвать исключения времени выполнения.

Stack<T> (обобщённый)

  • Обеспечивает типобезопасность и избегает проблем с преобразованием типов.
  • Более высокая производительность, поскольку избегает накладных расходов на упаковку и распаковку.

Коллекции C#

Другие расширения