题解 | #表达式求值#

表达式求值

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

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // Write your code here
  const stack = [];
  while ((line = await readline())) {
    // console.log(eval(line));
    console.log(calculate(line))
  }
})();

function calculate(s) {
  let stack = [];
  let num = 0;
  let sign = "+";
  for (let i = 0; i < s.length; i++) {
    let c = s[i];
    // 如果是左括号,找到对应的右括号,递归计算括号内的值
    if (c == "(") {
      let j = i;
      let count = 0; // 记录左括号的个数,当 count == 0 时,找到了对应的右括号
      for (; j < s.length; j++) {
        if (s[j] == "(") count++;
        if (s[j] == ")") count--;
        if (count == 0) break;
      }
      num = calculate(s.substring(i + 1, j));
      i = j;
    }
    if (!isNaN(c)) {
      num = num * 10 + parseInt(c);
    }
    if ((isNaN(c) && c != " ") || i == s.length - 1) {
      if (sign == "+") {
        stack.push(num);
      } else if (sign == "-") {
        stack.push(-num);
      } else if (sign == "*") {
        stack.push(stack.pop() * num);
      } else if (sign == "/") {
        stack.push(stack.pop() / num);
      }
      sign = c;
      num = 0;
    }
  }
  return stack.reduce((a, b) => a + b);
}

全部评论

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
牛客28967172...:跟着卡子哥才是正道,灵茶属实不太行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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