C#. Зачем нужны Stack и Queue?

Я не понимаю зачем это нужно. Можете привести простенький пример в каких ситуациях они применяются(небольшой участок кода и описание в каках ситуациях они могут применяться (пример: "может пригодится если нужно найти то-то..."))?


Ответы (1 шт):

Автор решения: CrazyElf

Навскидку по одной типовой задаче для обоих классов.

Stack: В реальной жизни стек мне не пригождался, но могут быть специфические какие-то задачи. Например, на собеседованиях бывает спрашивают задачу на проверку баланса скобок в выражении. Эта задача лучше всего решается с помощью стека - кладёте очередную открывающую скобку в стек, а когда приходит закрывающая скобка, проверяете, что у вас там в стеке лежит, соответствующая ли открывающая скобка или нет.

Queue: Вот очередь в реальной жизни очень даже часто бывает нужна. Например, у вас есть какая-то задача, которая разбивается на подзадачи (такого же типа) и число задач заранее неизвестно, они образуются по ходу дела. Например, вам нужно скачать какой-то сайт (или список сайтов), вы парсите одну страницу, на этой странице есть ссылки на другие страницы и т.д. При каждом таком парсинге вы пополняете очередь - добавляете в неё очередные задачу на скачку страниц, ссылки на которые нашли. А после окончания обработки задачи (парсинга страницы) достаёте из очереди очередную задачу, которую нужно обработать (в данном случае - ссылку, которую нужно скачать) и т.д. В принципе, можно было бы такое делать и без очереди - просто делать Task.Run на скачку страниц, а там уже сами Task-и будут стоять в своей очереди. Но ваша собственная очередь полезна тем, что сервер может быть недоступен в какое-то время, или там могут быть временные проблемы с отдачей конкретных страниц. Если у вас организована очередь задач на скачку, вы можете отложить скачку таких проблемных страниц и сайтов на потом и снова вернуться к их обработке, когда закончите обработку других задач. Если обрабатывать задачи через Task.Run у вас просто может получиться очень много Task которые будут висеть в памяти и ждать пока ссылка станет доступной. А это требует больше ресурсов системы, чем просто хранить в очереди коллекцию ссылок.

Да, при желании оба этих класса реализуются через другие классы: через список и через кольцевой буфер (массив). Но специализированные классы всегда лучше. Там сделаны оптимизации, там реализованы проверки корректности работы с коллекцией. А если вы сами будете делать свой стек и свою очередь, то можете что-то забыть. Удобнее пользоваться готовыми классами, специализированными под определённые типы задач.

→ Ссылка