List<T>
from System.Collections.Generic
делает все Stack<T>
и многое другое - они основаны на одной и той же базовой структуре данных. При каких условиях правильнее выбрать Stack<T>
вместо?
Зачем использовать стек <T> вместо List<T>?
Ответ 1
Вы использовали бы стек, если бы вам понадобилась коллекция элементов Last In First Out. Список позволит вам получить доступ к ним в любом индексе. Есть много других различий, но я бы сказал, что это самое фундаментальное.
Обновление после вашего комментария:
Я бы сказал, что использование Stack<T>
делает выражение о том, как вы хотите использовать этот код. Всегда хорошо планировать будущее, но если у вас есть потребность в Stack<T>
прямо сейчас, и нет веских оснований для использования List<T>
, тогда я бы пошел с Stack<T>
Ответ 2
Ну, вы бы хотели использовать Stack
, если бы вы логически пытались представить стек. Он передаст намерение программиста на протяжении всего кода, если вы используете стек, и это предотвратит неправильное использование рекламой структуры данных (непреднамеренно добавление/удаление/чтение где-то, кроме одного конца).
Конечно, возможно, что Stack
, а не конкретная реализация, может быть просто интерфейсом. Тогда вы могли бы что-то вроде List
реализовать этот интерфейс. Проблема в основном заключается в удобстве. Если кому-то нужен стек, им нужно выбрать определенную реализацию и запомнить ( "О да, список предпочтительной реализации стека" ), а не просто создавать конкретный тип.
Ответ 3
почему я искусственно ограничусь использованием стека в новом коде
Вот ваш ответ - вы должны использовать Stack
когда вам необходимо реализовать договорное ожидание того, что используемая структура данных может работать только как стек. Конечно, время, которое вы действительно хотите сделать, ограничено, но это важный инструмент, когда это уместно.
Например, предполагается, что данные, с которыми вы работаете, не имеют никакого смысла, если не установлен порядок стеков. В этих случаях вы бы столкнулись с проблемами, если бы сделали данные доступными в виде списка. С помощью Stack
(или Queue
, или любой другой структуры, чувствительной к порядку) вы можете указать в своем коде, каким именно образом предполагается использовать данные.
Ответ 4
Все о концепции. Список - это список, а стек - стек, и они выполняют две разные вещи. Их единственная общность - их общий характер и их переменная длина.
Список - это набор элементов переменной длины, в котором любой элемент может быть доступен и перезаписан индексом, и к каким элементам можно добавить и из каких элементов можно удалить любой такой индекс.
A Stack - это набор элементов переменной длины, поддерживающий модель доступа LIFO; можно получить доступ только к верхнему элементу стека, и элементы могут быть добавлены и удалены только из этой "конечной точки" коллекции. Элементы элемента 3 из "верхнего" могут быть доступны только путем "выскакивания" двух элементов над ним, чтобы выставить его.
Использовать правильный инструмент для задания; используйте Список, когда вам нужен "случайный" доступ к любому элементу коллекции. Используйте Stack, если вы хотите обеспечить более ограниченный доступ к элементам в массиве, доступный только "топ-только". Используйте очередь, когда вы хотите обеспечить выполнение "конвейера" FIFO; предметы входят в один конец, другой.
Ответ 5
System.Collections.Generic.Stack<T>
- это структура данных LIFO (Last-In, First-Out) aka stack.
Несмотря на свое название, SCG.List<T>
- это не абстрактный тип данных, известный как [связанный] список: это, по сути, массив переменной длины.
Два очень разных существа.