Stacks & Queues - Javascript - Способы реализации и пример работы настройки? - PullRequest
1 голос
/ 06 июня 2019

EDIT

I would disagree that this is a duplicate, I am not asking for the best way to implement them, my questions below are asking for clarity on the how many ways are there to define them as well as asking for an example of when this would be thought of and used in a work setting. (т.е. можно определить как объект?)

Я читаю абзац из учебной программы, и мне нужна ясность по этому вопросу:

Структура данных стека реализует коллекцию приоритетов LIFO. Он обеспечивает эти две функции: push и pop. push добавляет элемент в начало стека, а pop удаляет самый верхний элемент.

Мне дали этот пример given a string, reverse it using a stack

КОД

Я привел это в качестве примера:

let word = 'Bloc';

const reverseString = (str) => {

  let stack = [];

  for (let i of str) {

      stack.push(str[i]);

  }

  let reversed = '';

  for (let i of word) {

      reversed += stack.pop();

  }

  return reversed;

 }

console.log(reverseString('Bloc'));
  1. Когда вы определяете стек или используете его, являются ли array, linked lists, and as a class единственными способами определить стек?

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

  3. В параграфе, который я дал вверху, говорится, что он предоставляет 2 функции, push and pop, что автоматически означает array и array methods верно? Будут ли они рассматриваться как дополнительные функции, которые являются дополнением к другим средствам определения стека?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Существует множество различных способов имитировать стек, но, в конце концов, все они сводятся к тому, чтобы быть вариацией объекта JavaScript.JavaScript не имеет встроенных структур, таких как Stacks, Queues или Linked Lists. Даже Array - это форма объекта с некоторыми дополнительными методами.Прототипирование Javascript - это то, что дает вам возможность имитировать эти структуры и формировать вариации объектов.Простым примером, имитирующим стек, может быть использование конструктора, который генерирует объект с его собственными методами:

function Stack() {
  return {
    items: [],
    push: function ( item ) {
      this.items[this.items.length] = item;
    }
    pop: function () {
      const topItem = this.items[this.items.length - 1];
      this.items.length = this.items.length - 1;
      return topItem;
    }
  }
}      

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

Например, допустим, вы получаете набор данных, который включает время начала и время окончания, когда пользователи были на вашем сайте., упорядоченный по времени начала (например, [[02:30, 03:00][02:45, 3:15][4:00, 5:30][5:00, 6:00]), и ваша работа отображала график времени, когда пользователи были на вашем сайте, а не на вашем сайте.Одним из решений, чтобы увидеть промежутки и сохранить их в порядке, было бы объединить перекрывающиеся интервалы (пример становится [[2:30, 3:15][4:00, 6:00]]).

Вы можете сделать это с помощью «стека», поместив первый элемент в стек, сравнивая это со следующим интервалом в вашей коллекции.Если бы он не перекрывался, вы просто поместили бы этот элемент в стек, но если бы он действительно перекрылся, вы бы вытолкнули его из стека, объединили два и затем вернули его обратно в стек для сравнения, когдаследующий элемент.

Так что да, в JavaScript вы, вероятно, все равно использовали бы для этого массив, но объединяя идею структуры стека.Если вы начнете работать на других языках (обычно статических, таких как Java или C ++), у них будут встроенные стеки, очереди, связанные списки и т. Д., Поэтому важно понимать, как они работают, а также плюсы / минусы / варианты использования для каждого из них.их.

1 голос
/ 06 июня 2019

В двух словах - stack - это просто структура данных, которая используется для решения конкретных проблем на разных языках, в системах, библиотеках и т. Д.

  1. Если мы говорим конкретно о javascript, то я бы сказал, что перечисленные вами пути (массив, связанные списки, как класс) - это хорошее начало для построения стека. Однако все они являются просто структурами данных, которые вы пытаетесь использовать для построения другой структуры данных. Любой тип stack, который вы строите, создан для определенной цели и с другими атрибутами. Например, вы можете ограничить количество элементов в вашем стеке в любое время (скажем, максимальное количество элементов в вашем стеке равно 4, тогда, когда вы попытаетесь добавить 5-й элемент в свой стек - оно достигнет stack overflow и не позволит вам сделай это). Вы также можете ограничить, какой тип данных идет туда. Все зависит от того, какова цель этого стека. Массивы являются отличным способом визуализации стека и являются фантастической отправной точкой для его создания, поскольку они уже предоставляют вам методы манипулирования собой, как это делает стек (push и pop). Но вам не нужно использовать массивы, вы можете использовать objects и найти способы работы с ними. Мир - твоя устрица:)
  2. Лично я не часто собираю стеки на своем рабочем месте (я работаю веб-разработчиком). Однако важно знать и понимать структуру данных. Если вы собираетесь работать в среде, которая выполняет много манипуляций с данными - вы будете также время от времени писать свою собственную реализацию стека. Некоторые библиотеки js имеют свои собственные реализации стека, и если вы собираетесь их создавать - ну, тогда вы должны узнать, как это работает! Если вы будете работать с графиками и графическими данными - необходимо понимание стека. Опять же, все зависит от того, насколько тяжелым является ваше рабочее место для агрегирования и обработки данных.
  3. push и pop в js предназначены для Arrays, это правильно. Я бы сказал, что эти две функции являются неотъемлемой частью стека, поскольку они предоставляют вам базовые средства манипулирования стеком. Однако эти 2 метода не являются полностью определяющими, и их можно добавить гораздо больше.

Надеюсь, это поможет. Удачи!

...