import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { Stack<Character> ops = new Stack<Character>(); Stack<Integer> nums = new Stack<>(); char[] ch = s.toCharArray(); for(int i=0;i<ch.length;i++){ if(ch[i] == '(' || ch[i] == '*' ) ops.push(ch[i]); else if(IsNum(ch[i])) { String temp = ""; while(i<ch.length && IsNum(ch[i])) temp = temp + ch[i++]; i--; nums.push(Integer.parseInt(temp)); } else if(ch[i] == '+' || ch[i] == '-' ){ while(!ops.empty() && (ops.peek()=='*' ||ops.peek()=='+' ||ops.peek()=='-')){ int num1 = nums.pop(); int num2 = nums.pop(); int res = calculate(ops.pop(),num1,num2); nums.push(res); } ops.push(ch[i]); } else if(ch[i] == ')'){ while(!ops.empty() && ops.peek() != '('){ int num1 = nums.pop(); int num2 = nums.pop(); int res = calculate(ops.pop(),num1,num2); nums.push(res); } ops.pop(); } } int res = 0; while(!ops.empty()){ int num1 = nums.pop(); int num2 = nums.pop(); int temp_res = calculate(ops.pop(),num1,num2); nums.push(temp_res); } return nums.pop(); } public int calculate(char op, int b, int a){ if(op == '+') return a+b; if(op == '-') return a-b; if(op == '*') return a*b; return 0; } public boolean IsNum(char num){ if('0'<= num && num<='9') return true; else return false; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { if(s.length()<2){return (int)s.charAt(0);} Stack<Character> ops = new Stack<Character>(); // 存放运算符 Stack<Integer> num = new Stack<Integer>(); // 存放数 num.push(0); for(int i = 0 ; i<s.length();){ // 从头扫描到尾 if(s.charAt(i) == '('){ // 遇到直接进栈 无任何操作 ops.push(s.charAt(i++)); } else if(s.charAt(i) == ')'){ // 优先级最高 计算括号里的内容 把结果放入num while(ops.peek()!='('){ char op = ops.pop(); int numb = num.pop(); int numa = num.pop(); num.push(calculate(op,numa,numb)); } ops.pop();// ‘(’最后一个判断并没有在运算符栈中弹出 这里需要补上 i++; }else if(s.charAt(i) == '*'){ // 乘法直接入栈就行 他的优先级第二高 不用管栈里是什么运算, //如果算上除法 其实是有顺序的 遇到同等优先级的 先算之前的,但是乘法具有交换性 所以 ops.push('*'); i++; }else if(s.charAt(i) == '+' || s.charAt(i) == '-'){ // 需要判断 如果里面优先级低于 则入栈 大于等于则先计算里面的 if(ops.isEmpty()){ ops.push(s.charAt(i++)); } else if( ops.peek() == '*' || ops.peek() == '-' || ops.peek() == '+' ){ char op = ops.pop(); int numb= num.pop(); int numa = num.pop(); num.push(calculate(op,numa,numb)); } else ops.push(s.charAt(i++)); }else{//处理数字 int numa = 0; while(i<s.length() && IsNum(s.charAt(i))){ numa = 10*numa + s.charAt(i++) - '0'; } num.push(numa); } } int res = 0; //如果还有没计算完的部分 继续计算 while(!ops.isEmpty()){ char op = ops.pop(); int numb = num.pop(); int numa = num.pop(); res = res + num.push(calculate(op,numa,numb)); } return res; } public int calculate(char op, int a, int b){ if(op == '+') return a+b; if(op == '-') return a-b; if(op == '*') return a*b; return 0; } public boolean IsNum(char num){ if('0'<= num && num<='9') return true; else return false; } }
化简版
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { if(s.length()<2){return (int)s.charAt(0);} Stack<Character> ops = new Stack<Character>(); Stack<Integer> num = new Stack<Integer>(); num.push(0); for(int i = 0 ; i<s.length();){ if(s.charAt(i) == '('){ ops.push(s.charAt(i++)); } else if(s.charAt(i) == ')'){ while(ops.peek()!='('){ num.push(calculate(ops.pop(), num.pop(),num.pop())); } ops.pop(); i++; }else if(s.charAt(i) == '*'){ ops.push('*'); i++; }else if(s.charAt(i) == '+' || s.charAt(i) == '-'){ if(ops.isEmpty()){ ops.push(s.charAt(i++)); } else if( ops.peek() == '*' || ops.peek() == '-' || ops.peek() == '+' ){ num.push(calculate(ops.pop(), num.pop(),num.pop())); } else ops.push(s.charAt(i++)); }else{ int numa = 0; while(i<s.length() && IsNum(s.charAt(i))){ numa = 10*numa + s.charAt(i++) - '0'; } num.push(numa); } } int res = 0; while(!ops.isEmpty()){ res = res + num.push(calculate(ops.pop(), num.pop(),num.pop())); } return res; } public int calculate(char op, int b, int a){ if(op == '+') return a+b; if(op == '-') return a-b; if(op == '*') return a*b; return 0; } public boolean IsNum(char num){ if('0'<= num && num<='9') return true; else return false; } }