calculadora de prefijos usando pila en javascript

Sep 05 2020

Estoy tratando de hacer una calculadora con el método de entrada RPN (notación de pulido inverso) usando la pila en javascript.

input : [1, 5, '+', 6, 3, '-', '/', 7, '*']

1 es un operando, presione para apilar.

5 es un operando, presione para apilar.

'+' es un operador, muestre 1 y 5, calcúlelos y envíe el resultado a Stack.

6 es un operando, presione para apilar.

3 es un operando, presione para apilar.

'-' es un operador, resalte 6 y 3, réstelos y empuje el resultado a Stack.

'/' es un operador, extrae 6 y 3, los divide y envía el resultado a Stack.

7 es un operando, presione para apilar.

'*' es un operador, muestre 2 y 7, multiplíquelos y envíe el resultado a Stack.

output : [14]

¿Existe alguna otra alternativa para hacer que mi código sea más efectivo?

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);

Respuestas

3 NinaScholz Sep 05 2020 at 01:12

Puede tomar un objeto para todos los operadores y verificar si el valor de inputes un operador, luego realizar la operación con los valores revelados invertidos de la pila o empujar el valor a la pila.

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; }