#javascript #arrays #algorithm #stack
#javascript #массивы #алгоритм #стек
Вопрос:
я пытаюсь создать калькулятор с использованием метода ввода RPN (обратная польская нотация) с использованием стека в javascript.
input : [1, 5, ' ', 6, 3, '-', '/', 7, '*']
1 — это операнд, помещаемый в стек.
5 — это операнд, помещаемый в стек.
‘ ‘ — это оператор, выберите 1 и 5, вычислите их и отправьте результат в стек.
6 — это операнд, помещаемый в стек.
3 — это операнд, помещаемый в стек.
‘-‘ — это оператор, выберите 6 и 3, вычтите их и отправьте результат в стек.
‘/’ — это оператор, выбирающий 6 и 3, разделяющий их и отправляющий результат в стек.
7 — это операнд, помещаемый в стек.
‘*’ — это оператор, выберите 2 и 7, умножьте их и отправьте результат в стек.
output : [14]
есть ли какая-либо другая альтернатива, чтобы сделать мой код более эффективным?
const x1 = x.push(1);
const x2 = x.push(5);
const x3 = x.push(' ');
x.pop(1);
x.pop(5);
x.pop(' ');
x.push(1 5);
const x4 = x.push(6);
const x5 = x.push(3);
const x6 = x.push('-');
x.pop(6);
x.pop(3);
x.pop('-');
x.push(6-3);
const x7 = x.push('/');
x.pop(6);
x.pop(3);
x.pop('/');
x.push(6/3);
const x8 = x.push(7);
const x9 = x.push('*');
x.pop(2);
x.pop(7);
x.pop('*');
x.push(2*7);
console.log(x);
Комментарии:
1. A. Это постфикс, а не префикс. B. Вы должны просто вызывать
x.pop()
без параметра и использовать результаты из всплывающих окон. Кроме того, вам необходимо создать функции сложения, вычитания, умножения и деления, которые принимают по два параметра каждая, вместо использования -*/ в вашем коде2. ах да, моя ошибка. это постфикс. хорошо, попробую. Спасибо
Ответ №1:
Вы могли бы взять объект для всех операторов и проверить, является ли значение input
оператором, затем выполнить операцию с обратными извлеченными значениями стека или поместить значение в стек.
const
operators = {
' ': (a, b) => a b,
'-': (a, b) => a - b,
'*': (a, b) => a * b,
'/': (a, b) => a / b
},
input = [1, 5, ' ', 6, 3, '-', '/', 7, '*'],
stack = [];
input.forEach(value => {
stack.push(value in operators
? operators[value](...stack.splice(-2))
: value
);
console.log(...stack);
});
.as-console-wrapper { max-height: 100% !important; top: 0; }
Комментарии:
1. Вау, это удивительно лаконичная реализация! 1
2. итак, мы просто извлекаем элемент из
input
и помещаем его в новый массивstack
. нет необходимости использовать.pop()
?3. да, но
stack.splice(-2, 2)
удаляет последние два значения из стека и возвращает их в виде массива. этот массив используется в качестве параметров для операции.