C# Стек
В C# Stack — это структура данных, работающая по принципу «последним пришел — первым вышел» (LIFO).
Stack подходит для хранения и обработки данных в последовательности, где последний добавленный элемент удаляется первым.
Stack представляет собой коллекцию объектов, работающую по принципу«последним пришел — первым вышел». Когда вам нужен доступ к элементам по принципу «последним пришел — первым вышел», используйте стек. Когда вы добавляете элемент в стек, вызываетсяPushэлемент, а когда удаляете элемент из стека, вызываетсяPopэлемент.
Stack предоставляет две реализации:
- необобщённая
Stack(System.Collections.Stack): Поддерживает хранение объектов любого типа (требуются операции упаковки и распаковки). - Обобщения
Stack<T>(System.Collections.Generic.Stack<T>): Поддерживает строго типизированные объекты, избегает упаковки и распаковки и повышает производительность.
Возможности Stack:
- Последним вошёл — первым вышел: Последний элемент, помещённый в стек, извлекается первым.
- Динамический размер: Ёмкость стека динамически изменяется по мере необходимости.
- Поддержка обобщений: с помощью
Stack<T>Обеспечивает типобезопасность, избегая ошибок преобразования типов. - Не потокобезопасен: по умолчанию
StackиStack<T>Ни один из них не является потокобезопасным.
Методы и свойства класса Stack
В таблице ниже перечисленыStackНекоторые общие члены классаСвойство:
| Имя атрибута | Type | Описание |
|---|---|---|
Count | int | Получает количество элементов в стеке. |
SyncRoot | object | Получает объект, используемый для синхронизации доступа к стеку (необобщенному). |
IsSynchronized | bool | Указывает, синхронизирован ли доступ к стеку (потокобезопасный, всегдаfalse)。 |
В таблице ниже перечислены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.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.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> (обобщённый)
- Обеспечивает типобезопасность и избегает проблем с преобразованием типов.
- Более высокая производительность, поскольку избегает накладных расходов на упаковку и распаковку.