Q25- code150- 逆波兰表达式求值

37 阅读1分钟

实现思路

方法1: map + 栈 + ~~向下取整

1 使用map 简化代码分支

2 使用 栈存储 操作数

  • 需要把上一次的结果入栈,以进行下一次的操作

3 Math.floor是向下取整,而非分数部分截断==> 不能处理负数截断的情况

参考文档

01- 官方实现

代码实现

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