题解 | #表达式求值#
表达式求值
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);
}
查看14道真题和解析
