基本计算器
07/16/2021
题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
- 1 <= s.length <= 3 * 105
- s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
- s 表示一个有效的表达式
- '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
- '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
- 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
本人题解
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
s = s.split(' ').join('').split('');
let stack = [{value: 0, c: '+', l: '+', n: ''}];
function calc() {
let curS = stack[stack.length-1]
if (!!curS.n) {
curS.value = curS.l == '+' ? curS.value + parseInt(curS.n) : curS.value - parseInt(curS.n)
}
}
s.forEach((c, i) => {
if (c == '(') {
let curS = {value: 0, c: '+', l: '+', n: ''}
if (s[i-1] == '-') {
curS.c = '-'
}
stack.push(curS)
} else if (c == ')') {
calc()
let curS = stack.pop()
stack[stack.length-1].value = curS.c == '-' ? stack[stack.length-1].value - curS.value : stack[stack.length-1].value + curS.value
} else if (c == '+' || c == '-') {
calc()
let curS = stack[stack.length-1]
curS.l = c
curS.n = ''
} else {
let curS = stack[stack.length-1]
curS.n = curS.n + c
}
})
calc()
return stack[0].value
};分析
忘了。以后再补