在 javascript 中使用堆栈的前缀计算器
prefix calculator using stack in javascript
我正在尝试使用 javascript 中的堆栈使用 RPN(逆波兰表示法)输入法制作计算器。
input : [1, 5, '+', 6, 3, '-', '/', 7, '*']
1为操作数,入栈
5为操作数,入栈
'+'是一个运算符,pop 1和5,计算它们并将结果推入Stack。
6为操作数,入栈
3为操作数,入栈
'-'是一个运算符,pop 6和3,将它们相减并将结果压入Stack。
'/'是一个操作符,pop 6和3,将它们相除并将结果推入Stack。
7为操作数,入栈
'*'是一个运算符,弹出2和7,将它们相乘并将结果压入Stack。
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);
你可以取一个所有运算符的对象,检查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; }
我正在尝试使用 javascript 中的堆栈使用 RPN(逆波兰表示法)输入法制作计算器。
input : [1, 5, '+', 6, 3, '-', '/', 7, '*']
1为操作数,入栈
5为操作数,入栈
'+'是一个运算符,pop 1和5,计算它们并将结果推入Stack。
6为操作数,入栈
3为操作数,入栈
'-'是一个运算符,pop 6和3,将它们相减并将结果压入Stack。
'/'是一个操作符,pop 6和3,将它们相除并将结果推入Stack。
7为操作数,入栈
'*'是一个运算符,弹出2和7,将它们相乘并将结果压入Stack。
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);
你可以取一个所有运算符的对象,检查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; }