实现思路
方法1: map + 栈 + ~~向下取整
1 使用map 简化代码分支
2 使用 栈存储 操作数
- 需要把上一次的结果入栈,以进行下一次的操作
3 Math.floor是向下取整,而非分数部分截断==> 不能处理负数截断的情况
参考文档
代码实现
1 方法1: map + 栈 + ~~向下取整 时间复杂度 O(n) 空间复杂度:O(n)
function evalRPN(tokens: string[]): number {
const st = [];
const opesMap = new Map([
["+", (a, b) => a + b],
["-", (a, b) => a - b],
["*", (a, b) => a * b],
// 易错点1: 负数时Math.floor的取整值不对,所以用~~ 向下取整
["/", (a, b) => ~~(a / b)],
]);
for (let str of tokens) {
const fn = opesMap.get(str);
// 说明遇到的是字符类型的数字: 入栈即可
if (!fn) {
st.push(+str);
} else {
// 说明遇到了操作符: 去除栈尾2个数字进行操作,并把结果存入栈尾
// 易错点2: 第1个弹出的是v2, 第2个弹出的是v1
let v2 = st.pop(), v1 = st.pop();
// 易错点3: 要把上一次的操作结果入栈,而不是固定的相加
st.push(fn(v1, v2));
}
}
return st[0];
}