https://leetcode-cn.com/problems/basic-calculator-ii/
参考leetcode大神写的
+ - ( )(224. 基本计算器) 或者 + - * /(227. 基本计算器 II) 或者有锁题,包含符号 + - * / ( ) 772. 基本计算器 III 亦或是进阶题, 包含自定义函数符号 770. 基本计算器 IV
的表达式
的表达式
双栈解决「通用表达式」问题的通用解法
https://leetcode-cn.com/problems/basic-calculator-ii/solution/shi-yong-shuang-zhan-jie-jue-jiu-ji-biao-c65k/
const readline = require('readline');
const rl = readline.createInterface({
input:process.stdin,
output:process.stdout
});
const opsMap = {'+':1,'-':1,'*':2,'/':2};
const convert = (inputs) => {
if(!inputs.length)return;
let ops = [];
let temp = [];
for(let i = 0; i < inputs.length; i++){
let cs = inputs[i];
if(/\d/.test(cs)){// 数字
temp.push(cs);
while(i+1 < inputs.length && /\d/.test(inputs[i + 1])){
temp[temp.length - 1] += inputs[i+1];
i++;
}
}else if(cs === '('){ // 入栈 操作符
ops.push(cs)
if(inputs[i+1]==='+'||inputs[i+1]==='-'){
temp.push('0');
}
}else if(cs === ')'){
while(ops.length){
let op = ops.pop();
if(op === '('){
break;
}else{
temp.push(op)
}
}
}else{
while(ops.length >= 0){
const topOp = ops[ops.length -1];
if(!ops.length || topOp === '(' || opsMap[cs] > opsMap[topOp]){
ops.push(cs);
break;
}else{
temp.push(ops.pop())
}
}
}
}
while(ops.length){
temp.push(ops.pop());
}
return temp;
}
const calculate = (temp) =>{
if(!temp.length)return 0;
let res = []
temp.forEach(i=>{
if(/\d/.test(i)){
res.push(i)
}else{
const b = ~~res.pop();
const a = ~~res.pop();
if(i==='+') res.push(a+b);
else if(i==='-') res.push(a-b);
else if(i==='*') res.push(a*b);
else if(i==='/') res.push(a/b);
}
})
return res.pop();
}
rl.on('line',(line)=>{
console.log(calculate(convert(line)))
})

京公网安备 11010502036488号