题解 | #四则运算#

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

JavaScript 解法

使用 eval 函数让刷题锻炼逻辑思维毫无意义。

还是学习一下四则运算的思维吧。

参考

代码

const operatorMap = {
  "+": 1,
  "-": 1,
  "*": 2,
  "/": 2,
  "^": 2,
  "%": 2
};

// 中缀表达式转逆波兰表达式
const convert = (inputArr = []) => {
  if (inputArr.length === 0) return [];

  const ops = [];
  const outputs = [];

  const n = inputArr.length;
  for (let i = 0; i < n; i++) {
    const elem = inputArr[i];
    if (/\d/.test(elem)) {
      outputs.push(elem);
      while (i + 1 < inputArr.length && /\d/.test(inputArr[i + 1])) {
        outputs[outputs.length - 1] += inputArr[i + 1];
        i++;
      }
    } else if (elem === "(" || elem === "[" || elem === "{") {
      // 入栈 操作符
      ops.push("(");
      if(inputArr[i+1] === '-' || inputArr[i+1] === '+') {
        outputs.push('0')
      }
    } else if (elem === ")" || elem === "]" || elem === "}") {
      while (ops.length) {
        const op = ops.pop();
        if (op === "(") break;
        outputs.push(op);
      }
    } else {
      // 如果是正常运算符
      while (ops.length >= 0) {
        const topOp = ops[ops.length - 1];
        // 如果运算符栈为空,或顶部运算符是 '(' ,亦或当前运算符优先级比栈顶优先级高
        if (
          ops.length === 0 ||
          topOp === "(" ||
          operatorMap[elem] > operatorMap[topOp]
        ) {
          ops.push(elem);
          break;
        } else {
          // 不然,就应该计算当前输出结果
          outputs.push(ops.pop());
        }
      }
    }
  }
  // 循环结束,如果运算符栈不为空,则添加到输出结果栈
  while (ops.length) {
    outputs.push(ops.pop());
  }
  return outputs;
};

const compute = (left, right, op) => {
  switch (op) {
    case "+":
      return left + right;
    case "-":
      return left - right;
    case "*":
      return left * right;
    case "/":
      return left / right;
    case "^":
      return left ** right;
    default:
      throw Error("bad oprator:" + op);
  }
};

const calc = (strArr = []) => {
  if (!Array.isArray(strArr) || strArr.length === 0) return 0;
  const tempArr = [];

  strArr.forEach((key) => {
    if (/\d/.test(key)) {
      tempArr.push(key);
    } else {
      // 运算符
      const left = ~~tempArr.pop();
      const right = ~~tempArr.pop();
      if (isNaN(left) || isNaN(right)) {
        throw Error(`无效表达式: ${strArr.join(",")}`);
      }
      tempArr.push(compute(right, left, key));
    }
  });
  return ~~tempArr[0];
};
const input = readline();
const strArr = convert([...input])
console.log(calc(strArr))
全部评论
看到四则运算就头皮发麻..... 出栈入栈,逆波兰表达式,递归好多种方法可行,但是没有一种精通/(ㄒoㄒ)/~~ 作者牛逼呀(๑•̀ㅂ•́)و✧
1 回复 分享
发布于 2022-04-24 23:30
真头皮发麻
1 回复 分享
发布于 2022-06-15 10:04
真是一股清流
点赞 回复 分享
发布于 2022-03-14 18:42
牛逼呀
点赞 回复 分享
发布于 2022-03-20 19:56
这必须给个赞
点赞 回复 分享
发布于 2022-03-26 20:38
两个波浪号~~是什么意思?
点赞 回复 分享
发布于 2023-12-17 20:47 湖北

相关推荐

头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
22
1
分享

创作者周榜

更多
牛客网
牛客企业服务