В чем разница между стеком и очередью
Перейти к содержимому

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

  • автор:

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

Видео: Что такое Event Loop в JavaScript? Event Loop Простыми словами

Стек против очереди

Стек — это упорядоченный список, в котором вставка и удаление элементов списка могут выполняться только на одном конце, называемом верхним. По этой причине стек считается структурой данных Last in First Out (LIFO). Очередь также является упорядоченным списком, в котором вставка элементов списка выполняется на одном конце, называемом задним, а удаление элементов выполняется на другом конце, называемом передним. Этот механизм вставки и удаления делает очередь структурой данных «первым пришел — первым обслужен» (FIFO).

Что такое стек?

Как упоминалось ранее, стек — это структура данных, в которой элементы добавляются и удаляются только с одного конца, называемого вершиной. Стеки позволяют выполнять только две основные операции, называемые push и pop. Операция push добавляет новый элемент в верхнюю часть стека. Операция pop удаляет элемент из вершины стека. Если стек уже заполнен, когда выполняется операция push, это считается переполнением стека. Если операция выталкивания выполняется для уже пустого стека, это считается опустошением стека. Из-за небольшого количества операций, которые могут быть выполнены со стеком, он считается ограниченной структурой данных. Кроме того, в соответствии со способом определения операций push и pop очевидно, что элементы, которые были добавлены в стек последними, выходят из стека первыми. Поэтому стек рассматривается как структура данных LIFO.

Что такое очередь?

В очереди элементы добавляются из конца очереди и удаляются из начала очереди. Поскольку элементы, которые добавляются первыми, будут удалены из очереди первыми, она поддерживает порядок FIFO. Благодаря такому порядку добавления и удаления элементов очередь представляет собой идею линии оформления заказа. Общие операции, поддерживаемые очередью, — это операции постановки в очередь и удаления из очереди. Операция включения в очередь добавляет элемент в конец очереди, а операция удаления из очереди удаляет элемент из передней части очереди. Как правило, очереди не имеют ограничения на количество элементов, которые могут быть добавлены в очередь, помимо ограничений памяти.

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

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

1.1. PROграммист. Структуры данных — Stack (стек)

Эта статья является отправной точкой целой серии статей “PROграммист”, в которых я буду объяснять различные аспекты программирования, простым языком, без формальностей. Надеюсь мои труды не пропадут зря и помогут кому-то стать реальным PRO!

Поехали!

Начнём со структур данных, а точнее со Stack (стек). Из названия понятно, что он представляет из себя “стопку”, где забираешь тот предмет, который положил последним в стопку. Мне не нравятся примеры с книгами и тарелками, где вот есть стопка книг/тарелок, первым ты возьмёшь ту, что сверху, которую положил последней. Плохой пример, ведь можно включить зануду и сказать “ха, так я могу приподнять первые n книг/тарелок и взять с середины”, поэтому я больше люблю аналогию с магазином автомата, как по мне эталонный стек, зарядил патрон, ты его и выстрелишь первым, и никаких там “взять с середины”.

Для стека используются две основные операции — push и pop. Push — добавить элемент в стек, pop — удаляем элемент из стека. Проще простого! Чтобы проще было понять, держи гифку о том, как это все работает, хотя тут и так всё проще простого.

Теперь создадим стек в JavaScript:

Конечно ты можешь возмутиться “что за треш, у массивов в JS и без того есть функции push() и pop() , чтобы работать как со стеком”, но ведь задача показать именно принцип работы стека. И как видно из кода, тут добавилась ещё одна операция peek() , которая по сути выполняет то же самое, что и pop() , но без удаления элемента.

На этом думаю всё, дальше продолжим говорить про структуры данных. Надеюсь тебе понравилось, %USERNAME%.

Помогите разобраться в разнице между очередями и стекам

Мне не понятна тема очередей стеков и вариантов из реализаций. Выжимка из того что мне удалось накопать в гугле выглядит как-то так:

1.

Queue это односторонняя очередь — можно получить элементы в том порядке что и добавляли.

Вопрос: Вроде-бы PriorityQueue и LinkedList ее реализации в коллекциях java. А другие есть? Или по другому:

Можно ли сказать что любая коллекция которая дает возможность получить элементы в порядке их добавления это Queue , или только эти две?

2.

Deque это двусторонняя очередь — очередь, у которой нет явно выраженного конца и начала. Она может расти и уменьшаться в обоих направлениях.

Вопрос: Вот это совсем не понятно это по типу как замкнутый двунаправленный связанный список? Что это? Не понятна идея и какую проблему она решает.

3.

И есть стек — тут можно получить только последний элемент.

Вопрос: Вроде у List есть реализация Stack она вроде как отражает эту идею. А еще есть реализации? А какую проблему этот механизм решает?

Вот запутался немного, помогите разобраться что для чего нужно, и какие реализации имеет. Спасибо.

Pavel's user avatar

Очередь — это как конвейер. С одной стороны кладешь, с другой забираешь.

Стек — как обойма пистолета, что последним кладешь, то первым забираешь.

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

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

Нужны эти инструменты как некий буфер для временного хранения, в основном. То есть у вас поступает какая то информация, вы ее складываете в этот стек/очередь, а потом обрабатываете, либо в порядке поступления первые первыми — очередь, либо последние первыми — стек.

Почитать с картинками можно статьи, вроде этой, здесь о самостоятельной реализации, но принцип хорошо описан «изнутри».

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

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

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

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

Сравнительная таблица

Основа для сравнения стек Очередь
Принцип работы LIFO (последний пришел первым вышел) FIFO (первый на первом)
Состав Тот же конец используется для вставки и удаления элементов. Один конец используется для вставки, т. Е. Задний конец, а другой конец используется для удаления элементов, т. Е. Передний конец.
Количество использованных указателей Один Два (в простом случае очереди)
Выполненные операции Push и Pop Ставить в очередь и оставлять в очередь
Экспертиза пустого состояния Топ == -1 Фронт == -1 || Фронт == Тыл + 1
Экспертиза полного состояния Топ == Макс — 1 Задний == Макс — 1
Варианты У него нет вариантов. У этого есть варианты как круговая очередь, приоритетная очередь, дважды законченная очередь.
Реализация Simpler Сравнительно сложный

Определение стека

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

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

пример

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

Определение очереди

Очередь с линейной структурой данных относится к категории непримитивного типа. Это коллекция элементов подобного типа. Добавление новых элементов происходит на одном конце, называемом задним концом. Точно так же удаление существующих элементов происходит на другом конце, называемом Front-end, и это логически тип списка «первым пришел — первым обслужен» (FIFO).

пример

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

Ключевые различия между стеком и очередью

  1. Стек следует за механизмом LIFO с другой стороны. Очередь следует за механизмом FIFO для добавления и удаления элементов.
  2. В стеке один и тот же конец используется для вставки и удаления элементов. Напротив, два разных конца используются в очереди для вставки и удаления элементов.
  3. Поскольку в стеке есть только один открытый конец, это является причиной использования только одного указателя для ссылки на вершину стека. Но очередь использует два указателя для ссылки на передний и задний конец очереди.
  4. Стек выполняет две операции, известные как push и pop, а в очереди его называют enqueue и dequeue.
  5. Реализация стека проще, тогда как реализация очереди сложна.
  6. Очередь имеет варианты, такие как круговая очередь, приоритетная очередь, очередь с двойным окончанием и т. Д. В отличие от стека нет вариантов.

Реализация стека

Стек может быть применен двумя способами:

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

Реализация очереди

Очередь может быть реализована двумя способами:

  1. Статическая реализация : если очередь реализована с использованием массивов, точное количество элементов, которые мы хотим сохранить в очереди, должно быть заранее определено, поскольку размер массива должен быть объявлен во время разработки или до начала обработки. В этом случае начало массива станет передней частью очереди, а последнее местоположение массива будет действовать в качестве задней части очереди. Следующее отношение дает всем элементам, существующим в очереди, при реализации с использованием массивов:
    спереди — сзади + 1
    Если задний <front>, то в очереди не будет элементов, или очередь всегда будет пустой.
  2. Динамическая реализация . При реализации очередей с использованием указателей основным недостатком является то, что узел в связанном представлении потребляет больше памяти, чем соответствующий элемент в представлении массива. Поскольку в каждом узле имеется по меньшей мере два поля, одно для поля данных, а другое для хранения адреса следующего узла, тогда как в связанном представлении присутствует только поле данных. Преимущество использования связанного представления становится очевидным, когда требуется вставить или удалить элемент в середине группы других элементов.

Операции над стеком

Основные операции, которые могут выполняться в стеке:

  1. PUSH : когда новый элемент добавляется на вершину стека, называется операцией PUSH. Нажатие элемента в стеке вызывает добавление элемента, так как новый элемент будет вставлен сверху. После каждой операции толчка верх увеличивается на единицу. Если массив заполнен и новый элемент не может быть добавлен, это называется условием STACK-FULL или STACK OVERFLOW. РАБОТА С НАЖИМОМ — функция в С:
    Учитывая стек объявлен как
    int stack [5], top = -1;
    void push()
    <
    int item;
    if (top < 4)
    <
    printf ("Enter the number") ;
    scan ("%d", & item) ;
    top = top + 1;
    stack [top] = item;
    >
    else
    <
    printf (" Stack is full");
    >
    >
  2. POP : когда элемент удаляется из верхней части стека, он называется операцией POP. Стек уменьшается на единицу после каждой операции pop. Если в стеке не осталось элемента и выполняется всплывающее окно, это приведет к условию STACK UNDERFLOW, означающему, что ваш стек пуст. POP OPERATION — функции в C:
    Учитывая стек объявлен как
    int stack [5], top = -1;
    void pop()
    <
    int item;
    if (top >= 4)
    <
    item = stack [top];
    top = top — 1;
    printf ("Number deleted is = %d", item) ;
    >
    else
    <
    printf (" Stack is empty");
    >
    >

Операции в очереди

Основные операции, которые могут быть выполнены в очереди:

  1. Постановка в очередь : для вставки элемента в очередь. Операция постановки в очередь в C:
    Очередь объявлена ​​как
    int queue [5], Front = -1 and rear = -1;
    void add ()
    <
    int item;
    if ( rear < 4)
    <
    printf ("Enter the number") ;
    scan ("%d", & item) ;
    if (front == -1)
    <
    front =0 ;
    rear =0 ;
    >
    else
    <
    rear = rear + 1;
    >
    queue [rear] = item ;
    >
    else
    <
    printf ("Queue is full") ;
    >
    >
  2. Исключение : Для удаления элемента из очереди. Функция операции извлечения в C:
    Очередь объявлена ​​как
    int queue [5], Front = -1 and rear = -1;
    void delete ()
    <
    int item;
    if ( front ! = -1)
    <
    item = queue [ front ] ;
    if (front == rear)
    <
    front =-1 ;
    rear =-1 ;
    >
    else
    <
    front = front + 1;
    printf ("Number deleted is = %d", item) ;
    >
    >
    else
    <
    printf ("Queue is empty") ;
    >
    >

Приложения стека

  • Разбор в компиляторе.
  • Виртуальная машина Java.
  • Отменить в текстовом редакторе.
  • Кнопка «Назад» в веб-браузере.
  • Язык PostScript для принтеров.
  • Реализация вызовов функций в компиляторе.

Приложения очереди

  • Буферы данных
  • Асинхронная передача данных (файловый ввод-вывод, каналы, сокеты).
  • Распределение запросов по общему ресурсу (принтер, процессор).
  • Анализ трафика.
  • Определите количество кассиров в супермаркете.

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *