题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

思路

本题使用第50题的解法处理,统一使用双栈

  • 构建运算符对象,增加优先级
  • 构建取出两个数和一个运算符计算的函数
  • 构建主函数,初始化双栈

代码

const opsMap = {
  "+": 1,
  "-": 1,
  "*": 2,
  "/": 2,
};

const calc = (nums = [], ops = []) => {
//   console.log(nums, ops)
  if (nums.length < 2 || ops.length === 0) return;
  const op = ops.pop();
  const b = ~~nums.pop();
  const a = ~~nums.pop();
//   console.log(op, a, b)

  switch (op) {
    case "+":
      nums.push(a + b);
      break;
    case "-":
      nums.push(a - b);
      break;
    case "*":
      nums.push(a * b);
      break;
    default:
      nums.push(a / b);
  }
};

const calculator = (str = "") => {
  const cs = str.split("");
  const nums = [0];
  const ops = [];

  for (let i = 0; i < cs.length; i++) {
    let c = cs[i];
    if (c === "(") {
      // 入栈
      ops.push("(");
      if (cs[i + 1] === "-" || cs[i + 1] === "+") {
        nums.push(0);
      }
    } else if (c === ")") {
      while (ops.length) {
        if (ops[ops.length - 1] !== "(") {
          calc(nums, ops);
        } else {
          ops.pop();
          break;
        }
      }
    } else {
      if (/\d/.test(c)) {
        while (i + 1 < cs.length && /\d/.test(cs[i + 1])) {
          c += cs[i + 1];
          i++;
        }
        nums.push(c);
      } else {
        // 加减乘除
        while (ops.length && ops[ops.length - 1] !== "(") {
          // 根据优先级进行运算
          const topOp = ops[ops.length - 1];
          if (opsMap[topOp] >= opsMap[c]) {
            calc(nums, ops);
          } else {
            break;
          }
        }
        ops.push(c);
      }
    }
  }
  while (ops.length) calc(nums, ops);
  return nums[nums.length - 1];
};

while(input = readline()) {
  console.log(calculator(input))
}

全部评论

相关推荐

点赞 评论 收藏
分享
10-19 10:28
已编辑
成都理工大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
越今朝0:慧择一共几面啊,我二面后就没声音了。。
点赞 评论 收藏
分享
评论
18
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务