калькулятор префиксов с использованием стека в javascript

#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) удаляет последние два значения из стека и возвращает их в виде массива. этот массив используется в качестве параметров для операции.