保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
数据范围:表达式计算结果和过程中满足 ,字符串长度满足
数据范围:表达式计算结果和过程中满足 ,字符串长度满足
输入一个算术表达式
得到计算结果
3+2*{1+2*[-4/(8-6)+7]}
25
const line = readline(); let string = line.replace(/[\{\}\[\]]/g, (match) => { switch (match) { case "{" : return "("; case "}" : return ")"; case "[" : return "("; case "]" : return ")"; } }); let rightIndex = string.indexOf(")"); while (rightIndex !== -1) { const leftIndex = string.lastIndexOf("(", rightIndex); const expression = string.slice(leftIndex + 1, rightIndex); const result = calculate(expression); string = string.slice(0, leftIndex) + result + string.slice(rightIndex + 1); rightIndex = string.indexOf(")"); } console.log(calculate(string)); function calculate(expression) { const arr = expression.match(/([\+-]?[0-9]+)|[\*\/]/g); let multiple = true; let result = 0; while (multiple) { const index = arr.findIndex(element => element === "*" || element === "/"); if (index !== -1) { const num1 = parseInt(arr[index - 1], 10); const num2 = parseInt(arr[index + 1], 10); const mark = arr[index]; if (mark === "*") { result = num1 * num2; } else { result = num1 / num2; } arr.splice(index - 1, 3, result); } else { multiple = false; } } result = 0; for (const num of arr) { result = result + parseInt(num, 10); } return result; }
let str = readline(); let sstack = []; let nstack = []; for(let i=0;i<str.length;i++){ //当是0-9数字时 if(str[i].match(/[0-9]/)){ //如果是负数 if(ifNG()){ sstack.pop(); // console.log("有一个负数:"+parseInt(str[i])) nstack.push(0-parseInt(str[i])) }else if(str[i-1]=='-'){ //如果前面是-,但不是负数,那么转化为+负数 sstack.pop(); sstack.push("+"); nstack.push(0-parseInt(str[i])) }else{ nstack.push(str[i]) } //再判断是否为多位数(十百千万),通过判断前一位是否是数字 if(str[i-1] && str[i-1].match(/[0-9]/)){ let digit = parseInt(nstack.pop()); let decade = parseInt(nstack.pop()); nstack.push(decade*10 + digit) } } //当是+-/*时 if(str[i].match(/[\+\-\*\/]/)){ // console.log(str[i]) if((sstack[sstack.length-1]=="*" || sstack[sstack.length-1] == "/")){ //当遇到栈顶是最高运算符*/,那么就先将栈顶元素出栈并计算,然后再将该元素入栈。 let sym = sstack.pop(); let num2 = parseInt(nstack.pop()); //操作数 let num1 = parseInt(nstack.pop()); //被操作数 nstack.push(compute(num1,num2,sym)) } sstack.push(str[i]) // console.log(sstack+'==========') } //当是左括号时 if(str[i].match(/[\{\[\(]/)){ sstack.push(str[i]) } //当是右括号(分开判断) if(str[i]==")"){ clean("(") } if(str[i]=="]"){ clean("[") } if(str[i]=="}"){ clean("{") } } //当循环结束,先从左至右遍历sstack找出乘除进行运算 if(sstack.indexOf("*")!=-1 || sstack.indexOf("/")!=-1){ let sLen = sstack.length; for(let i=0; i<sLen; i++){ let sym = sstack.shift(); if(sym=='*' || sym=='/'){ let num1 = parseInt(nstack.shift()); //被操作数 let num2 = parseInt(nstack.shift()); //操作数 nstack.push(compute(num1,num2,sym)); }else{ //否则推到栈顶继续判断下一个 nstack.push(nstack.shift()); sstack.push(sym); } } } //当循环结束,此时乘除都没了 while(sstack.length!=0){ let sym = sstack.shift(); let num1 = parseInt(nstack.shift()); //被操作数 let num2 = parseInt(nstack.shift()); //操作数 nstack.unshift(compute(num1,num2,sym)) } //输出结果,为数据栈仅剩的一个数字 console.log(nstack[0]) function clean(leftSym){ // console.log("括号"+sstack) let sym; while((sym = sstack.pop()) && (sym != leftSym)){ // console.log(sym) let num2 = parseInt(nstack.pop()); //操作数 let num1 = parseInt(nstack.pop()); //被操作数 nstack.push(compute(num1,num2,sym)) } } function compute(num1,num2,sym){ if(sym=="*"){ // console.log(num1+"*"+num2+"="+(num1*num2)) return num1*num2; }else if(sym=="/"){ // console.log(num1+"/"+num2+"="+(num1/num2)) return num1/num2; }else if(sym=="+"){ // console.log(num1+"+"+num2+"="+(num1+num2)) return num1+num2; }else if(sym=="-"){ // console.log(num1+"-"+num2+"="+(num1-num2)) return num1-num2; } } //负数判断,如果去掉左括号,符号栈的length和数字栈的length一样大,那么该数为负数 function ifNG(){ //只有当栈顶为-才判断 if(sstack[sstack.length-1]!="-") return false; let leftS = 0; for(let i=0;i<sstack.length;i++){ if(sstack[i]=="{" || sstack[i]=="[" || sstack[i]=="("){ leftS++; } } let sLen = sstack.length - leftS; if(sLen==nstack.length+1){ //如果运算符比数字还多一位,那么铁定是负数了 return true; } }