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

Sep 05 2020

Я пытаюсь сделать калькулятор с методом ввода 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);

Ответы

3 NinaScholz Sep 05 2020 at 01:12

Вы можете взять объект для всех операторов и проверить, является ли значение 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; }