在javascript中使用堆栈的前缀计算器

mak*_*v19 2 javascript arrays algorithm stack

我正在尝试使用 JavaScript 中的堆栈使用 RPN(反向波兰表示法)输入法制作计算器。

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);
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 5

您可以为所有运算符获取一个对象,并检查 的值是否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);
});
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是 `stack.splice(-2, 2)` 会删除堆栈的最后两个值并将它们返回到数组中。该数组作为操作的参数进行传播。 (3认同)