Реализация стека и очереди в JavaScript для алгоритма

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для реализации стека и очереди в JavaScript используются разные методы массива. Логика работы стека соответствует принципу LIFO (Last In First Out, "последним пришёл – первым ушёл") и реализуется с помощью методов push (добавление элементов) и pop (извлечение элементов). Для очереди применяется принцип FIFO (First In First Out, "первым пришёл – первым ушёл"), а методы – push и shift. Примеры реализации выглядят так:

JS
Скопировать код
// Стек (LIFO)
class Stack {
  constructor() { this.stack = []; }
  push(item) { this.stack.push(item); }
  pop() { return this.stack.pop(); }
}

// Очередь (FIFO)
class Queue {
  constructor() { this.queue = []; }
  enqueue(item) { this.queue.push(item); }
  dequeue() { return this.queue.shift(); }
}

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

Кинга Идем в IT: пошаговый план для смены профессии

Эффективность при построении структур данных

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

  • Операции со стеком: Для добивания лучшей производительности используйте исключительно методы push и pop массива, чтобы избегать нежелательных изменений временной сложности.

  • Производительность очереди: Для небольших массивов сочетание методов push и shift – отличное решение. Но если размер данных увеличивается, стоит задуматься о использовании таких структур, как связанные списки – это поможет избежать замедления, связанного с постоянной реиндексацией массива.

  • Операции реиндексации: Старайтесь избегать методов unshift и splice, потому что они могут привести к снижению производительности из-за частой реиндексации.

  • Изучение лучших практик: Ресурсы такие как safalra.com предлагают продвинутые техники управления очередями.

Реализация продвинутых структур данных

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

Структуры связного списка

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

JS
Скопировать код
class Node {
  constructor(data) { this.data = data; this.next = null; }
}

class Queue {
  constructor() {
    this.head = null;
    this.tail = null;
  }
  
  enqueue(data) {
    const newNode = new Node(data);
    if (!this.head) {
      this.head = this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
  }

  dequeue() {
    if (!this.head) return null;
    const data = this.head.data;
    this.head = this.head.next;
    if (!this.head) this.tail = null;
    return data;
  }
}
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Алгоритм обхода в ширину

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

  • Стек: Предназначен для временного хранения операторов и функций.
  • Очередь: Используется для упорядоченного хранения результатов.

Эффективное отображение содержимого

Правильное отображение содержимого стека или очереди помогает при отладке:

JS
Скопировать код
// Для стека
printStack() {
  console.log(this.stack.join(' -> '));
}

// Для очереди
printQueue() {
  let current = this.head;
  let output = "";
  while (current) {
    output += `${current.data} -> `;
    current = current.next;
  }
  console.log(output.slice(0, -4));
}

Визуализация

Наглядное представление стека и очереди в контексте JavaScript:

Markdown
Скопировать код
Стек:    [item1] ➡️ добавление элемента
         [item2 ➡️ item1] ➡️ добавление ещё одного элемента
         [item3 ➡️ item2 ➡️ item1] ➡️ добавление третьего элемента
         [item2 ➡️ item1] ➡️ извлечение элемента (принцип LIFO)

Очередь: [item1] ➡️ добавление нового элемента
         [item1 ➡️ item2] ➡️ добавление второго элемента
         [item1 ➡️ item2 ➡️ item3] ➡️ добавление третьего элемента
         [item2 ➡️ item3] ➡️ удаление элемента (принцип FIFO)

Исходное состояние структур в JavaScript:

JS
Скопировать код
let stack = [];  // стек пуст
let queue = [];  // очередь пуста

Распространенные ошибки и пути их устранения

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

Полезные материалы

  1. Array – JavaScript | MDN — широкий обзор работы с массивами, актуально при использовании стеков и очередей.
  2. Реализация стека на JavaScript – GeeksforGeeks — подробное руководство по стекам на JavaScript.
  3. Алгоритмы и структуры данных на JavaScript: Стеки — репозиторий на GitHub с примерами работы со стеками.
  4. Алгоритмы и структуры данных на JavaScript: Очереди — репозиторий на GitHub с примерами работы с очередями.
  5. Реализация очереди на JavaScript – Статья на Medium — прекрасная статья с практическими примерами.
  6. Educative: Интерактивные курсы для разработчиков программного обеспечения — глубокое руководство по стекам и очередям.
  7. Учебник | DigitalOcean — удобное пособие по стекам на JavaScript от DigitalOcean.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой принцип описывает работу стека при добавлении и извлечении элементов?
1 / 5