Изучение методов поиска максимального значения в стеке с помощью JavaScript

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

Метод 1: использование массива для хранения максимальных значений
Один из способов найти максимальное значение в стеке — создать дополнительный массив для хранения максимального значения для каждого размера стека. Вот пример реализации:

class StackWithMax {
  constructor() {
    this.stack = [];
    this.maxValues = [];
  }
  push(value) {
    this.stack.push(value);
    const currentMax = this.maxValues.length === 0 ? value : Math.max(value, this.maxValues[this.maxValues.length - 1]);
    this.maxValues.push(currentMax);
  }
  pop() {
    this.maxValues.pop();
    return this.stack.pop();
  }
  getMax() {
    return this.maxValues[this.maxValues.length - 1];
  }
}

Метод 2: использование переменной для отслеживания максимального значения.
Другой метод — использовать переменную, которая отслеживает текущее максимальное значение. Всякий раз, когда новое значение помещается в стек, при необходимости мы обновляем максимальное значение. Вот пример реализации:

class StackWithMax {
  constructor() {
    this.stack = [];
    this.maxValue = Number.NEGATIVE_INFINITY;
  }
  push(value) {
    if (value > this.maxValue) {
      this.stack.push(this.maxValue);
      this.maxValue = value;
    }
    this.stack.push(value);
  }
  pop() {
    const value = this.stack.pop();
    if (value === this.maxValue) {
      this.maxValue = this.stack.pop();
    }
    return value;
  }
  getMax() {
    return this.maxValue;
  }
}

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

class SortedStackWithMax {
  constructor() {
    this.stack = [];
  }
  push(value) {
    let inserted = false;
    const tempStack = [];
    while (!inserted && this.stack.length > 0) {
      const topValue = this.stack.pop();
      if (topValue > value) {
        tempStack.push(topValue);
      } else {
        inserted = true;
        tempStack.push(value);
        tempStack.push(topValue);
      }
    }
    if (!inserted) {
      tempStack.push(value);
    }
    while (this.stack.length > 0) {
      tempStack.push(this.stack.pop());
    }
    this.stack = tempStack;
  }
  pop() {
    return this.stack.pop();
  }
  getMax() {
    return this.stack[this.stack.length - 1];
  }
}

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

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