Подтвердить что ты не робот

Стек и очередь, почему?

Почему и когда я должен использовать структуры данных стека или очереди вместо массивов/списков? Можете ли вы показать пример состояния, который будет лучше, если вы будете использовать стек или очередь?

4b9b3361

Ответ 1

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

Первая очередь, сначала (FIFO)

Последний элемент, первый из которых (LIFO)

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

Ответ 2

Вы были в кафе, да? и увидел стопку пластин? Когда чистая пластина добавляется в стек, она помещается сверху. Когда пластина удаляется, она удаляется сверху. Поэтому он называется Last-In-First-Out (LIFO). Компьютерный стек подобен этому, за исключением того, что он содержит числа, и вы можете сделать один из массива или списка, если хотите. (Если стопка пластин имеет под ним spring, они говорят, что вы "нажимаете" один на верх, и когда вы удаляете его, вы "выталкиваете" его. То, откуда берутся эти слова.)

В столовой вернитесь назад, где они вымывают посуду. У них есть конвейерная лента, где они накладывают пластины на один конец, и они выходят на другой конец в том же порядке. Это очередь или First-In-First-Out (FIFO). Вы также можете сделать один из них из массива или списка, если хотите.

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

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

Другой способ - это прогулка в ширину. Начиная с соединительной линии, вы отбираете все ветки с магистрали и помещаете эти числа в очередь. Затем вы берете номер с другого конца, идите к этой ветке, и для каждой ветки, отходящей от нее, вы снова их номер (последовательно с первой) и помещаете их в очередь. По мере того, как вы продолжаете делать это, вы собираетесь сначала посетить ветки, которые 1 ветвь от ствола. Тогда вы собираетесь посетить все ветки, которые находятся в 2 ветких от ствола, и так далее. В конце концов вы попадете на листья, и вы сможете распечатать их.

Это два основных понятия в программировании.

Ответ 3

  • Используйте очередь, когда вы хотите получить информацию в том порядке, в котором вы их разместили.
  • Используйте стек, когда вы хотите получить информацию в обратном порядке, чем вы вставляете.
  • Используйте список, когда хотите получить что-либо, независимо от того, когда вы их вставляете (и когда вы не хотите, чтобы они автоматически удалялись).

Ответ 4

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

Ответ 5

Помимо соблюдения правил использования, о которых уже упоминали другие, также существует проблема с производительностью. Если вы хотите удалить что-то из начала массива или List (ArrayList), обычно требуется время O (n), но для очереди требуется время O (1). Это может иметь огромное значение, если есть много элементов.

Ответ 6

Массивы/списки и стеки/очереди не являются взаимоисключающими понятиями. Infact любых стеков или реализаций очереди, которые вы находите, почти наверняка используют либо массивы, либо списки под капотом.

Структуры массивов и списков предоставляют описание того, как хранятся данные, долгое время с гарантией сложности фундаментальных операций над структурами.

Стеки и очереди предоставляют подробное описание того, как элементы вставлены или удалены. FIFO для очередей, FILO для стеков.

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

Ответ 7

Это вопрос намерения. Стеки и очереди часто реализуются с использованием массивов и списков, но добавление и удаление элементов более строго определено.

Ответ 8

Стек и очередь представляют собой более продвинутые способы обработки коллекции, которая сама по себе массива, которая не устанавливает порядок в том, как элементы ведут себя внутри коллекции.

Stack (LIFO - Last in first out) и очередь (FIFO - First in First out) устанавливают и упорядочивают, когда ваши элементы вставляются и удаляются из коллекции.

Вы можете использовать массив или связанный список в качестве структуры хранилища для реализации шаблона Stack или Queue. Или даже создайте с этими базовыми структурами более сложные шаблоны, такие как двоичные деревья или очереди приоритетов, которые также могут принести не только порядок вставки и удаления элементов, но и сортировку их внутри коллекции.

Ответ 9

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

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

Ответ 10

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

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

Связанная очередь/связанный стек имеет гибкие высокоскоростные вставки/удаления с разумной реализацией, но требует большего объема памяти, чем массив. Вставки/удаления на концах массива являются недорогими до тех пор, пока вы не исчерпаете пространство; реализация массива очереди или стека потребует больше работы для изменения размера, поскольку вам нужно будет скопировать оригинал в большую структуру (или сбой с ошибкой переполнения).

Ответ 11

Я думаю, что стек и очередь - это концепция доступа к памяти, которая используется в соответствии с требованиями приложения. но массив и связь - это два способа доступа к памяти, которые используют концепцию стека реализации (LIFO) и очереди (FIFO), когда это необходимо.