Подсчет значений стека с использованием алгоритма javascript

Мне нужна помощь, чтобы понять, как создать алгоритм JavaScript, который подсчитывает значения стека, мне предоставлено 3 пользовательских метода.

Stack - объект Stack, содержащий ноль или более значений.

.pop(), который извлекает верхнее значение стека

.push(), который помещает значение в стек

.peek(), который показывает мне верхнее значение стека без изменения стека

Я попытался просто вернуть длину указанного стека вот так

function countValues(stack) {
  return stack.length
}

Но я возвращаюсь undefined, поэтому не имею успеха

Это класс стека, который использовался для реализации пользовательских методов.

class Stack {

  constructor(...values) {

    const data = {};

    let index = 0;

    this.push = function (value) {
      if (arguments.length < 1) {
        throw new TypeError('stack.push() requires a value argument');
      }
      if (typeof value === 'undefined') {
        throw new TypeError('stack.push(value) received undefined');
      }
      data[index] = value;
      index++;
    };

    this.pop = function () {
      const last = index - 1;
      if (last < 0) return;
      const value = data[last];
      delete data[last];
      index = last;
      return value;
    };

    this.peek = function () {
      const last = index - 1;
      if (last < 0) return;
      return data[last];
    };

    this.print = function () {
      if (index === 0) {
        return 'Stack { <empty> }';
      }
      let output = ' }';
      let last = index - 1;
      for (; last > 0; last--) {
        output = ' <- ' + JSON.stringify(data[last]) + output;
      }
      output = JSON.stringify(data[last]) + output;
      return 'Stack { ' + output;
    };

    for (let i = 0; i < values.length; i++) {
      this.push(values[i]);
    }

    Object.freeze(this);

  }

}

Это объект стека, содержащий ноль или более значений, я не совсем уверен, что это то, на что вы ссылаетесь, как это реализовано

poopmachine 24.01.2023 09:47

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

Ivar 24.01.2023 09:52

@poopmachine, опубликуйте какой-нибудь справочный код о вашем объекте стека.

Himanshu Shekhar 24.01.2023 09:53

Я обновил сообщение с кодом класса стека, я надеюсь, что это может помочь

poopmachine 24.01.2023 10:06

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

OliverRadini 24.01.2023 10:11

@poopmachine также, просто для справки в будущем, если вы можете включить код (как у вас есть), то это почти всегда поможет

OliverRadini 24.01.2023 10:12
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
0
6
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

class Stack {
  constructor(...values) {

    const data = {};

    let index = 0;

    this.push = function(value) {
      if (arguments.length < 1) {
        throw new TypeError('stack.push() requires a value argument');
      }
      if (typeof value === 'undefined') {
        throw new TypeError('stack.push(value) received undefined');
      }
      data[index] = value;
      index++;
    };

    this.pop = function() {
      const last = index - 1;
      if (last < 0) return;
      const value = data[last];
      delete data[last];
      index = last;
      return value;
    };

    this.peek = function() {
      const last = index - 1;
      if (last < 0) return;
      return data[last];
    };

    this.print = function() {
      if (index === 0) {
        return 'Stack { <empty> }';
      }
      let output = ' }';
      let last = index - 1;
      for (; last > 0; last--) {
        output = ' <- ' + JSON.stringify(data[last]) + output;
      }
      output = JSON.stringify(data[last]) + output;
      return 'Stack { ' + output;
    };

    for (let i = 0; i < values.length; i++) {
      this.push(values[i]);
    }

    Object.freeze(this);
  }
}

const myStack = new Stack(1, 2, 3, 4, 5);

// Here's an easy but not so good way:
function countValues1(stack) {
  return Array.from(stack.print()).filter(x => x === "<").length + 1;
}

// Here's another way, but it mutates the stack:
function countValues2(stack) {
  let count = 0;
  while (true) {
    if (stack.pop() === undefined) {
      break;
    }
    count++;
  }
  
  return count;
}

console.info(countValues1(myStack));
console.info(countValues2(myStack));

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

Length — это геттер, который по сути представляет собой функцию, выдающую себя за свойство. Он просто вернет undefined, если вы вызовете его для объекта, который его не реализует. Если в упражнении — я полагаю, так оно и есть — сказано, что вы можете использовать только вышеупомянутые методы, то вы не можете использовать object.length.

Возможно, это поможет вам выполнить функцию длины вручную. Вы должны проверить, как вы объявили свой стек, .length должен работать.

function countValues(stack) {
  const tempStack = stack;
  var length=0;

  while(tempStack.pop()!=undefined){
    length++;
  }
  return length;
}

Эта функция позволяет вам запускать ее и при этом сохранять ваши данные в исходном стеке.

Другие вопросы по теме