ElementAt()
предоставляется через Enumerable.ElementAt()
от Linq, а не через интерфейс Stack<T>
.
Это работает, потому что Stack<T>
реализует IEnumerable<T>
, что все, что нужнореализовать ElementAt()
, поскольку все, что он делает, - это перебирает все элементы, предоставленные с помощью IEnumerable<T>
, до тех пор, пока к ним не будет получен доступ к N.
Для Stack<T>
это операция O (N).Если вы используете ElementAt()
, скажем, с List<T>
, тогда внутренняя оптимизация превращает ее в операцию O (1).
Почему Stack<T>
реализует IEnumerable<T>
- только один из разработчиковдействительно могу ответить на этот вопрос.Так как это не мутирующая операция, то она не нарушает ничего фундаментального в стеке.Я бы предположил , что это было предоставлено для удобства.
Как указывает / u / Damien_The_Unbeliever в своем ответе, код может определить N-й элемент без интерфейса IEnumerable путем привязки N элементов к другому.укладывают, а затем толкают их все в обратном порядке, чтобы исходный стек не изменился.
Муха в этой мази заключается в том, что Microsoft не документирует порядок, в котором стек IEnumerable
возвращает его элементы.Вы можете проверить исходный код, чтобы убедиться, что он действительно возвращает элементы в порядке LIFO - но это просто не задокументировано.
Это обсуждается в ответах на этот вопрос .
В любом случае, где интерфейс ADT определен для абстрактного стека, о котором вы говорите?Я не думаю, что есть определенный ответ для этого.Строго говоря, можно сказать, что в стеке есть только Push()
и Pop()
.И все же большинство реализаций также предоставляют Count
.
Как и в , статья о стеке в Википедии гласит: :
Во многих реализациях стек имеет больше операций, чем"толчок" и "поп".В качестве примера можно привести «top of stack» или «peek», который наблюдает за самым верхним элементом, не удаляя его из стека.
, поскольку это можно сделать с помощью «pop» и «push» содни и те же данные, это не существенно.В операции «вершина стека» может возникнуть условие недостаточного заполнения, если стек пуст, так же, как и «pop».Кроме того, реализации часто имеют функцию, которая просто возвращает, является ли стек пустым.
Поэтому принципиально ответ на ваш вопрос:
Разработчики библиотеки решили добавить несколькоудобные методы без мутаций в дополнение к просто методам мутации Push()
и Pop()
.