Мне нужна помощь, чтобы понять, как создать алгоритм 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);
}
}
Мы, посторонние, понятия не имеем, как реализована структура данных stack. Мы вообще ничего о нем не знаем, кроме того, что он содержит значения. Мы не знаем, как перебирать элементы, чтобы их подсчитать. Должна быть некоторая доступная информация о том, как эта задача может быть достигнута. Вы можете выталкивать каждый элемент, но, конечно же, вы не хотите очищать стек при подсчете элементов.
@poopmachine, опубликуйте какой-нибудь справочный код о вашем объекте стека.
Я обновил сообщение с кодом класса стека, я надеюсь, что это может помочь
Ответ теперь обновлен, чтобы использовать предоставленный вами код
@poopmachine также, просто для справки в будущем, если вы можете включить код (как у вас есть), то это почти всегда поможет
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;
}
Эта функция позволяет вам запускать ее и при этом сохранять ваши данные в исходном стеке.
Это объект стека, содержащий ноль или более значений, я не совсем уверен, что это то, на что вы ссылаетесь, как это реализовано