var evalRPN = function (tokens) { const stack = [] const oprt = { '+': (a, b) => a + b, '-': (a, b) => a - b, '*': (a, b) => a * b, '/': (a, b) => ~~(a / b), } for(let char of tokens) { if(oprt[char]) { let b = stack.pop() let a = stack.pop() stack.push(oprt[char](a, b)) } else { stack.push(+char) } } return stack[0]};
var MinStack = function () { this.stack = [] this.MinStack = []};/** * @param {number} value * @return {void} */MinStack.prototype.push = function (value) { this.stack.push(value) let min = this.getMin() this.MinStack.push(min < value ? min : value)};/** * @return {void} */MinStack.prototype.pop = function () { this.stack.pop() this.MinStack.pop()};/** * @return {number} */MinStack.prototype.top = function () { return this.stack[this.stack.length - 1]};/** * @return {number} */MinStack.prototype.getMin = function () { return this.MinStack[this.MinStack.length - 1]};/** * Your MinStack object will be instantiated and called as such: * var obj = new MinStack() * obj.push(value) * obj.pop() * var param_3 = obj.top() * var param_4 = obj.getMin() */
var calculate = function (s) { let result = 0 // 当前已算出的值 let sign = 1 // 当前数字前的符号,+1 或 -1 let num = 0 // 正在拼接的整数 const stack = [] // 保存进入括号前的 result 和 sign for (const c of s) { if (c >= '0' && c <= '9') { num = num * 10 + +c // 拼接多位数 } else if (c === '+') { result += sign * num // 将上一个数字结算到 result num = 0 sign = 1 } else if (c === '-') { result += sign * num num = 0 sign = -1 } else if (c === '(') { stack.push(result) // 保存括号前的结果 stack.push(sign) // 保存括号前的符号 result = 0 // 重置,开始计算括号内的表达式 sign = 1 } else if (c === ')') { result += sign * num // 先结算括号内最后一个数字 num = 0 result *= stack.pop() // 用括号前的符号乘整个括号结果(处理负号) result += stack.pop() // 再加上括号前已有的结果 } } result += sign * num // 处理表达式末尾最后一个数字 return result};