题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
硬算...
let str = readline();
let stack = [];
let num = '';
for(let i = 0; i < str.length; i++) {
let item = str[i];
if('+-*/()'.indexOf(item) > -1) {
if(num) {
stack.push(Number(num));
}
stack.push(item);
num = '';
} else {
num += item;
}
}
if(num) stack.push(Number(num));
// getSum 用来运算
function getSum(arr) {
if(arr[0] == '-') {
let temp = arr[1];
arr.shift();
arr[0] = [-temp];
}
while(arr.includes("*") || arr.includes("/")) {
for(let i = 0; i < arr.length; i++) {
if(arr[i] == '*' || arr[i] == '/') {
let li = i + 1;
let fi = i - 1;
let result = 0;
if(arr[i] == '*') {
result = arr[fi] * arr[li];
}
if(arr[i] == '/') {
result = arr[fi] / arr[li];
}
arr.splice(fi, 3, result);
break;
}
}
}
let sum = arr[0];
for(let i = 0; i < arr.length; i++) {
if(arr[i] == '+') {
sum += arr[i+1];
} else if(arr[i] == '-') {
sum -= arr[i+1];
}
}
return sum;
}
// 找出()里面的先运算
for(let i = 0; i < stack.length; i++) {
let fi = 0;
let li = stack.length - 1;
if(stack[i] == ')') {
li = i;
for(let j = li; j >= 0; j--) {
if(stack[j] == '(') {
fi = j;
let arr = stack.slice(fi+1, li);
let result = getSum(arr);
stack.splice(fi, li-fi+1, result);
i = fi;
break;
}
}
}
}
if(stack[0] == '-') {
let temp = stack[1];
stack.shift();
stack[0] = [-temp];
}
let sum = getSum(stack);
console.log(sum);
