题目描述:
给你一个字符串数组 tokens ,表示一个根据?逆波兰表示法 表示的算术表达式。
*
* 请你计算该表达式。返回一个表示表达式值的整数。
?逆波兰表达式:
*
* 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
*
*
* 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
* 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
*
*
* 逆波兰表达式主要有以下两个优点:
*
*
* 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
* 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
除法注意小于0向上取整,大于0向下取整
function evalRPN(tokens) {
let stask = [];
for (let i = 0; i < tokens?.length; i++) {
// 数字入栈
if (/\d/.test(tokens[i])) {
stask.push(+tokens[i]);
} else {
const secNum = stask.pop();
const firNum = stask.pop();
eval(
`stask.push(${firNum} ${tokens[i]} ${secNum} < 0 ? Math.ceil(${firNum} ${tokens[i]} ${secNum}) : Math.floor(${firNum} ${tokens[i]} ${secNum}))`,
);
}
}
return stask.pop();
};
用时:
// Your runtime beats 20.53 % of typescript submissions
// Your memory usage beats 5.27 % of typescript submissions (59.6 MB)
除法的取整 实际上就是 Math.trunc 去掉小数部分
eval(`stask.push(Math.trunc(${firNum} ${tokens[i]} ${secNum}))`)