в чем основная разница между стеком и очередью?

130

В чем основная разница между стеком и очередью ??

Пожалуйста, помогите мне, я не могу найти разницу.

Как отличить стек от очереди?

Я искал ответ в разных ссылках и нашел этот ответ ..

В программировании высокого уровня

стек определяется как список или последовательность элементов, которые удлиняются за счет размещения новых элементов «поверх» существующих элементов и укорачиваются за счет удаления элементов из верхней части существующих элементов. Это ADT [абстрактный тип данных] с математическими операциями «push» и «pop».

Очередь - это последовательность элементов, которая добавляется путем размещения нового элемента позади существующего и сокращается путем удаления элементов перед очередью. Это ADT [абстрактный тип данных]. Эти термины понимаются больше при программировании на Java, C ++, Python и так далее.

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

Хариш Рачаконда
источник
12
Похоже, вы ответили на свой вопрос: стек - это контейнер «последний пришел - первый ушел» (LIFO), а очередь - это контейнер «первым пришел - первым ушел» (FIFO).
Iridium

Ответы:

151

Стек - это структура данных LIFO (последний пришел - первый ушел). Связанная ссылка на Википедию содержит подробное описание и примеры.

Очередь - это структура данных FIFO (первым пришел - первым ушел). Связанная ссылка на Википедию содержит подробное описание и примеры.

jhonkola
источник
132

Представьте себе стопку бумаги . Последний кусок, помещенный в стопку, находится сверху, поэтому он выходит первым. Это ЛИФО . Добавление листа бумаги называется «толканием», а удаление листа - «выталкиванием».

Представьте себе очередь в магазине . Первый человек в очереди - это первый человек, который выходит из строя. Это FIFO . Человек, попавший в очередь, «ставится в очередь», а человек, выходящий из очереди, «удаляется из очереди».

123
источник
3
Одна из лучших аналогий, которые я могу придумать.
Yeikel 03
83

Визуальная модель

Блины стека (LIFO)

Единственный способ добавить и / или удалить - сверху.

стопка блинов

Линейная очередь (FIFO)

Когда кто-то приходит, они приходят в конец очереди, а когда кто-то уходит, они уходят с начала очереди.

линия dmv

Интересный факт: британцы называют очереди людей очередью

Jacksonkr
источник
6
Джи, это должен быть ответ имо. Спасибо @Jacksonkr
Куласангар
Ха-ха, конечно, это идеальное описание очереди и стека, но просто для аргументации, что, если я хочу, чтобы на тарелку был добавлен первый блин? Я знаю, что это можно сделать с помощью stack.size () vs. if (! Stack.isEmpty ()), но все же этот первый блин может быть лучшим :) ... В любом случае, хороший ответ, и я согласен, что это самый ясный ... кажется интересным, что британцы называют строки очередями (если это верно), на языке, не являющемся программированием, я все равно считаю, что строка, в которой первая запись должна уйти первой (после выхода из строки / очереди )
ViaTech
Подождите, их больше нигде не называют очередями?
прогулка
37

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

Что касается стека, если у меня есть список a, b, c, и я добавляю dего, он прикрепляется к концу, поэтому я получаю a,b,c,d. Если я хочу вывести элемент из списка, я удаляю последний добавленный элемент, то есть d. После поп, мой список a,b,cснова

Для очереди я добавляю новые элементы таким же образом. a,b,cстановится a,b,c,dпосле добавления d. Но теперь, когда я открываю, мне нужно взять элемент из начала списка, так что он становится b,c,d.

Все очень просто!

cdesrosiers
источник
14

Очередь

Очередь - это упорядоченный набор элементов.

Элементы удаляются на одном конце, который называется «передним» концом очереди.

Элементы вставляются в другой конец очереди, называемый «задней частью».

Первый вставленный элемент удаляется первым (FIFO).

стек

Стек - это набор предметов.

Он позволяет получить доступ только к одному элементу данных: последнему вставленному элементу.

Элементы вставляются и удаляются с одного конца, который называется «Верх стопки».

Это динамичный и постоянно меняющийся объект.

Все элементы данных кладутся на вершину стека и снимаются с вершины.

Эта структура доступа известна как структура "последний вошел, первым ушел" (LIFO).

Диссанаяке
источник
Таким образом, в основном «очередь» - это «FIFO» - очередь «первым пришел - первым обслужен». В то время как «стек» является «LIFO» - последним в очереди - первым вышел. Я прав?
Себастьян Нильсен
@SebastianNielsen Да, правильно, как упомянуто в ответе.
Диссанаяке
Но в чем же тогда разница между связным списком и стеком? Разве это не то же самое?
Себастьян Нильсен
@SebastianNielsen Стек представляет собой ADT, что означает, что он предоставляет интерфейс, который является операцией push и pop, но основной механизм (реализация) скрыт от конечного пользователя. Стек может быть реализован с помощью массива или связанного списка.
gdyrrahitis
13

СТЕК:

  1. Стек определяется как список элементов, в который мы можем вставлять или удалять элементы только наверху стека.
  2. Поведение стека похоже на систему LIFO (Last-In First-Out).
  3. Стек используется для передачи параметров между функциями. При вызове функции параметры и локальные переменные сохраняются в стеке.
  4. Языки программирования высокого уровня, такие как Pascal, c и т. Д., Которые обеспечивают поддержку рекурсии, используют стек для учета. Помните, что при каждом рекурсивном вызове необходимо сохранять текущее значение параметров, локальных переменных и адрес возврата (адрес, на который элемент управления должен вернуться после вызова).

ОЧЕРЕДЬ:

  1. Очередь - это набор элементов одного типа. Это линейный список, в котором вставки могут происходить на одном конце списка, называемом задней частью списка, а удаления могут происходить только на другом конце, называемом передней частью списка.
  2. Поведение очереди похоже на систему «первым пришел - первым обслужен» (FIFO).
АШУТОШ КУМАР
источник
Я почти уверен, что вы также можете вставить в конец или начало стека, я думаю, что важно отметить здесь FIFO против LIFO
Майк
6

Стек - это набор элементов, которые можно сохранять и извлекать по одному. Элементы извлекаются в порядке, обратном их времени хранения, т. Е. Последний сохраненный элемент является следующим элементом, который будет извлечен. Стек иногда называют структурой Last-In-First-Out (LIFO) или First-In-Last-Out (FILO). Ранее сохраненные элементы не могут быть получены до тех пор, пока не будет получен последний элемент (обычно называемый «верхним» элементом).

Очередь - это набор элементов, которые можно сохранять и извлекать по одному. Элементы извлекаются в порядке их времени хранения, т. Е. Первый сохраненный элемент является следующим элементом, который будет извлечен. Очередь иногда называют структурой «первым пришел - первым ушел» (FIFO) или «Последний вошел - последний ушел» (LILO). Сохраненные впоследствии элементы не могут быть извлечены, пока не будет извлечен первый элемент (обычно называемый «передним» элементом).

Саураб Р.С.
источник
2

СТЕК: Стек определяется как список элементов, в который мы можем вставлять или удалять элементы только наверху стека.

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

Стек - это набор элементов, которые можно сохранять и извлекать по одному. Элементы извлекаются в порядке, обратном их времени хранения, т. Е. Последний сохраненный элемент является следующим элементом, который будет извлечен. Стек иногда называют структурой Last-In-First-Out (LIFO) или First-In-Last-Out (FILO). Ранее сохраненные элементы не могут быть получены до тех пор, пока не будет получен последний элемент (обычно называемый «верхним» элементом).

ОЧЕРЕДЬ:

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

Очередь - это набор элементов, которые можно сохранять и извлекать по одному. Элементы извлекаются в порядке их времени хранения, т. Е. Первый сохраненный элемент является следующим элементом, который будет извлечен. Очередь иногда называют структурой «первым пришел - первым ушел» (FIFO) или «Последний вошел - последний ушел» (LILO). Сохраненные впоследствии элементы не могут быть извлечены, пока не будет извлечен первый элемент (обычно называемый «передним» элементом).

shashimani
источник
2

Чтобы попытаться упростить описание стека и очереди, они оба являются динамическими цепочками информационных элементов, к которым можно получить доступ с одного конца цепочки, и единственная реальная разница между ними заключается в том, что:

при работе со стеком

  • вы вставляете элементы на одном конце цепочки и
  • вы извлекаете и / или удаляете элементы с одного и того же конца цепочки

пока с очередью

  • вы вставляете элементы на одном конце цепочки и
  • вы извлекаете / удаляете их с другого конца

ПРИМЕЧАНИЕ : я использую абстрактную формулировку извлечения / удаления в этом контексте, потому что бывают случаи, когда вы просто извлекаете элемент из цепочки или, в некотором смысле, просто читаете его или получаете доступ к его значению, но есть также случаи, когда вы удаляете элемент из цепочки. цепочка и, наконец, есть случаи, когда вы выполняете оба действия с одним и тем же вызовом.

Также слово «элемент» специально используется для того, чтобы максимально абстрагировать воображаемую цепочку и отделить ее от конкретных терминов языка программирования. Этим абстрактным информационным объектом, называемым элементом, может быть что угодно: указатель, значение, строка или символы, объект ... в зависимости от языка.

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

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

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

Наконец, вы должны знать, что есть и другие термины, которые используются для обозначения аналогичных концепций. Например, стек можно назвать кучей. Существуют также гибридные версии этих концепций, например, двусторонняя очередь может вести себя одновременно как стек и как очередь, поскольку к ней могут обращаться одновременно оба конца. Кроме того, тот факт, что структура данных предоставляется вам в виде стека или очереди, не обязательно означает, что она реализована как таковая, существуют экземпляры, в которых структура данных может быть реализована как что угодно и предоставлена ​​как конкретная структура данных просто потому, что ее можно заставить вести себя подобным образом. Другими словами, если вы предоставите метод push и pop для любой структуры данных, они волшебным образом станут стеками!

Ангелос Асонитис
источник
Не используйте форматирование кода для текста, не являющегося кодом.
Marquis of Lorne
1

СТЕК - это список LIFO (последний пришел, первый ушел). означает, что в стек вставлены 3 элемента, то есть 10,20,30. 10 вставляется первым, а 30 вставляется последним, поэтому 30 сначала удаляется из стека, а 10 - последним из стека. Это список LIFO (Last In First Out).

QUEUE - это список FIFO (First In First Out). Означает, что сначала вставляется один элемент, который должен быть удален в первую очередь, например, очередь людей.

Апурва Санджай Борсе
источник
1

Складывает рассматриваемую вертикальную коллекцию. Сначала поймите, что коллекция - это ОБЪЕКТ, который собирает и организует другие более мелкие ОБЪЕКТЫ. Эти меньшие ОБЪЕКТЫ обычно называют Элементами. Эти элементы «помещаются» в стек в порядке ABC, где A - первый, а C - последний. по вертикали это будет выглядеть так: добавлен 3-й элемент) C 2-й элемент добавлен) B 1-й элемент добавлен) A

Обратите внимание, что буква «А», которая была добавлена ​​в стек первой, находится внизу. Если вы хотите удалить «A» из стека, вам сначала нужно удалить «C», затем «B» и, наконец, ваш целевой элемент «A». Стек требует подхода LIFO при работе со сложностями стека. (Last In First Out) При удалении элемента из стека правильный синтаксис - pop. мы не удаляем элемент из стека, мы «выталкиваем» его.

Напомним, что «A» был первым элементом, помещенным в стек, а «C» был последним элементом, помещенным в стек. Если вы решите, что хотите увидеть, что находится внизу стека, так как 3 элемента в стеке упорядочены, A является первым, B является вторым, а C является третьим элементом, верх должен быть снят, а затем второй элемент добавлен для просмотра нижней части стека.

Zimmermen7
источник
Отформатируйте вопрос, чтобы он выглядел лучше и читабельнее.
Neeku 08