Рубрики
Без рубрики

! Стеки и очереди… Стеки || Очереди!

Стеки и очереди Стеки и очереди иногда устно используются как взаимозаменяемые или вместе… Помеченный структурами данных, java, данными, алгоритмами.

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

Стеки – это не примитивная структура данных (или абстрактный тип данных), которая имеет несколько методов .push() и .pop (), (), являются наиболее часто используемыми, но также имеют .peek(), чтобы получить верхний элемент, не удаляя его, .isFull () () чтобы проверить, заполнен ли он, и .Пуст () чтобы проверить, пусто ли оно. Стеки работают по принципу “Последний вход – первый выход” (LIFO), что означает, что элемент, который вы .push() помещаете в стек, также является тем же элементом, который возвращается при .pop () предмет выключен. Это можно увидеть на диаграмме ниже:

Это свойство LIFO важно для стеков и является наибольшей разницей между ним и очередью, которая имеет свойство “Первый вход – первый выход” (FIFO). Представьте себе стопку, похожую на стопку неорганизованных DVD-дисков на полке, когда вы пытаетесь посмотреть фильм. Чтобы добраться до “Полицейского из детского сада”, который вы не смотрели годами, вам нужно сначала просмотреть все остальные DVD поверх него. Другим примером может быть то, что вы только что купили и посмотрели “Человек-паук: В стихах о пауке”, поэтому вы бросаете его на вершину кучи. Теперь завтра вечером, когда вы захотите посмотреть его снова, вам не придется перебирать 150 поцарапанных копий фильмов о кунг-фу 80-х годов, чтобы добраться до него, вы знаете, что он прямо там, где вы его оставили. Очевидно, что это примитивный пример, так каковы же приложения реального мира, когда дело доходит до алгоритмов и программирования?

Создание стека

Во-первых, для создания стека нам нужен список упорядоченных данных, и нам всегда нужна ссылка на элемент в верхней части стека (или заголовок если хотите… держу пари, вы можете догадаться, к чему это приведет). Мы можем создать функциональный стек, используя связанный список! ух ты! Так мета… Используя связанный список, мы можем добавлять элементы в заголовок и удалять их из заголовка с постоянной временной сложностью ( O 1 ) потому что нам никогда не нужно перебирать список, просто обновите указатель на заголовок. Мы также можем добавить переменную экземпляра для длины, чтобы нам никогда не приходилось повторять .заполнен () или .пусто () либо.

Алгоритм стека

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

public String reverseString(String str){
    //initialize a new stack
    Stack stack = new Stack();
    //iterate through the string adding each char to stack
    for(int i = 0; i < string.length; i++){
        stack.push(str.charAt(i));
    };
    //initialize a new reversed string
    String reversedString = new String;
    //now push each char onto a new string
    while(!stack.isEmpty()){
        reversedString = reversedString + stack.pop;
    };
    //return the reversed string
    return reversedString;
};

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

Очереди – это тот же упорядоченный список элементов, который содержит стек, но элементы удаляются с противоположного конца, в который они добавляются. Чтобы визуализировать, вереница машин, въезжающих в туннель, выходит из туннеля в том же порядке (за исключением того, что мы на самом деле находимся в фильме “Форсаж”).:

Очереди также имеют две основные функции, но они известны как .enqueue() и .dequeue () вместо .push() и .pop () (() (() (() ( потому что разработчики любят заставлять вас вводить “q u e u e”, чтобы попытаться заставить вас споткнуться), а также содержать .peek() для просмотра элемента в конце очереди, .isFull () и .пусто (). Существуют также различные реализации очередей, включая Очередь с приоритетом, Циклическую очередь и очередь с двойным завершением. Приоритетная очередь – это очередь, в которой каждый элемент также имеет значение “приоритет”, и элементы с более высоким приоритетом обслуживаются первыми. Круговая очередь – это место, где хвост или конец очереди содержит ссылку на первый элемент. Наконец, Двусторонняя очередь – это очередь, в которой элементы могут быть как добавлены, так и удалены с любого конца очереди.

Создание очереди

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

Алгоритм очереди

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

На следующей неделе мы рассмотрим подходящее время для использования бинарных деревьев поиска!

Рекомендации
Рекомендации

Оригинал: “https://dev.to/spencerlindemuth/stacks-queues-stacks-queues-1ldp”