Когда использовать коллекцию Stack <T>в C #? - PullRequest
7 голосов
/ 07 января 2012

Я понимаю, как работают Stack() и Stack<T>, но я действительно не вижу сценариев, когда массив, List<T> или IEnumerable<T> не является лучшим и более легким выбором.

Может ли кто-нибудь предоставить мне реальный пример использования Stack<T>?

Ответы [ 12 ]

10 голосов
/ 07 января 2012

В идеале вы используете или создаете по мере необходимости классы, которые отражают то, как все работает в реальном мире, то, что вы моделируете в коде. Такие классы дают нам уровень абстракции, поэтому мы можем кодировать с точки зрения того, что мы моделируем / симулируем. Кроме того, при кодировании какой-то сложной вещи помогает использование знакомой парадигмы. То есть: О, этот класс Fuzzinator использует стек. Я знаю, что такое стек и как он работает.

Во-вторых, этот класс более высокого уровня абстракции дает нам код, который работает (мы предполагаем, что .NET Framework была протестирована) и экономит нам время и усилия на повторное изобретение колеса.

В-третьих, код легче читать, легче понимать, легче изменять и так далее. Это более ремонтопригодно.

Использование классов с более утонченной функциональностью помогает ограничить использование этого метода.

В целом ваше приложение просто лучше , если оно закодировано на соответствующих уровнях абстракции.

Стек является одним из этих классов.

Мой калькулятор HP-41X выполняет свою арифметику с использованием стека. Этот способ расчета называется RPN - обратная польская запись.

Если бы я имитировал кафетерий, стек был бы идеальным для этой стопки тарелок. Тарелки входят и выходят из стопки сверху. Не середина, не конец; только верх. Стек. Я могу только использовать Push () и Pop (), что делает код более простым и понятным.

В качестве альтернативы, представьте себе кодирование с использованием эквивалента C # субатомных частиц - универсальной коллекции или универсального IEnumerable и т. Д. В итоге я использую общие служебные методы и свойства с общими именами с несколькими переменными номерами параметров, которые в совокупности скрывают факт, что я укладываю тарелки.

4 голосов
/ 07 января 2012

Поиск в глубину (DFS) - хороший пример использования стека.

http://www.cs.toronto.edu/~heap/270F02/node36.html

3 голосов
/ 07 января 2012

Глубина первого обхода дерева . В отличие от очереди, для ширины первого обхода дерева.


Управление представлением различных экранов пользователю при их перемещении по ним. Отображение экрана подталкивает его к стеку, возвращаясь назад. Нарисуйте верхний экран.


Когда вам нужна коллекция, в которую вы можете добавлять вещи и всегда знать, когда вы что-то получаете, она добавляется самой последней.


Реализация функций отмены / возврата.

2 голосов
/ 07 января 2012

Вы можете переписать рекурсивные методы как итеративные аналоги гораздо проще, управляя локальными компьютерами в стеке и за его пределами.Проверьте сортировку Jon Skeet , используя стек здесь .

2 голосов
/ 07 января 2012

Если вы делаете вычисление выражения и синтаксический анализ, стек может быть полезной структурой данных.

1 голос
/ 07 января 2012
Стеки

полезны при преобразовании выражения из инфиксной нотации в префиксную нотацию. Например:

a + b до (+ a b)

1 голос
/ 07 января 2012

Стеки часто используются в алгоритмах синтаксического анализа текста, таких как оценка «4 + 5 + 6».Пример реального приложения, использующего стеки для анализа текста, см. В HTMLAgilityPack .Этот компонент используется для анализа HTML и включает в себя исходный код, чтобы вы могли видеть, как и где используются стеки ...

1 голос
/ 07 января 2012

Стек и очередь используют внутренне массив.Если вы использовали массивы разумным образом, велика вероятность, что вы уже использовали их в стеке или очереди, как в моде.Обычно вам нужно выбирать между стеком и очередью.Типичным примером, где требуется стек, является поиск в глубину .Если вы измените коллекцию на очередь, вы осуществите поиск в ширину.

Другим примером является интенсивная многопоточность, когда вы передаете данные между производителем и потребителем через стек, если порядок обработки не имеет значения.Основанием для этого является то, что если будет обрабатываться много данных, для ЦП будет лучше использовать последний добавленный блок данных для дальнейшей обработки в другом потоке, чтобы получить лучшую локальность кэша.

И этот список идетна ....

1 голос
/ 07 января 2012

Вот один способ, которым я использовал стек:

У меня есть страница, подобная мастеру, где есть 5 пользовательских элементов управления, которые необходимо отображать и обрабатывать в определенной последовательности, и пользователь должен иметь возможность в любой момент вернуться к последней странице по порядку.

Я использую конечный автомат на основе стека для отслеживания прогресса пользователей в мастере.

Каждый раз, когда они продвигаются, я помещаю состояние конечного автомата в стек, сохраняемый в сеансе, и, если они запрашивают возврат, я выскакиваю из верхнего значения и устанавливаю для машины новое значение верхнего стека. (Который, в свою очередь, отображает и загружает соответствующий элемент управления)

Еще один:

Мне пришлось создать приложение для установки некоторых очень пользовательских серверных приложений. В итоге я разбил каждый шаг установки на его собственный общий компонент, то есть компонент для копирования файла, компонент для записи значения реестра и т. Д. У каждого компонента были свои методы: выполнить действие установки, отменить действие установки.

На каждом этапе установки компонент помещается в стек.

Теперь, в любое время, когда у меня возникает ошибка, мы просто выталкиваем каждый компонент обратно из стека и запускаем действие отмены, давая нам детальные транзакции установки.

Стек - твой друг!

0 голосов
/ 11 апреля 2017

Отслеживание истории браузера - это использование стека. Кроме того, "отменить" для правок и т. Д. Аналогичным образом, некоторые системы управления складом используют стеки и очереди для управления порядком, в котором товары должны выбираться для отгрузок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...