题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
ref: https://blog.nowcoder.net/n/65fcad0be1a543359effef1228ae5d2e
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { // write code here s = s.trim(); // 用栈保存各部分计算的和 Stack<Integer> stack=new Stack<>(); int sum=0,number=0;// 使用 number 变量记录字符串中的数字部分的数字值是多少 // 使用 sign 变量记录运算符(前面的) char sign='+'; char[] cs=s.toCharArray(); for(int i=0;i<cs.length;i++){ char c=cs[i]; //遇到左括号时递归求这个括号里面的表达式的值 //先遍历找到对应的右括号,因为可能里面还嵌有多对括号, //使用一个变量 counterPartition 统计括号对数直到变量为 0 if(c=='('){ int j=i+1; int cntPar=1; while(cntPar>0){ if(cs[j]=='('){ cntPar++; } if(cs[j]==')'){ cntPar--; } j++; } // (3-4) // i j number=solve(s.substring(i+1,j-1)); i=j-1; } // 遇到数字时继续遍历求这个完整的数字的值,保存到 number 中 if(Character.isDigit(c)){ number=number*10+c-'0'; } // 遇到运算符时或者到表达式末尾时,就去计算上一个运算符 // 并把计算结果 push 进栈,然后保存新的运算符到 sign if(!Character.isDigit(c)||i==cs.length-1){ if(sign=='+'){ stack.push(number); }else if(sign=='-'){ stack.push(-1*number); }else if(sign=='*'){ stack.push(stack.pop()*number); }else if(sign=='/'){ stack.push(stack.pop()/number); } number=0; sign=c; } } // 最后把栈中的结果求和即可 while(!stack.isEmpty()){ sum+=stack.pop(); } return sum; } }