import java.util.Stack; public class Main { public Double Evaluate(String str) { Stack sk1 = new Stack(); Stack sk2 = new Stack(); for(int i = 0;i< str.length();i++) { String temp = str.charAt(i)+""; if(temp.equals("*")) sk1.push(temp); //不要加东西进去 不然会计算后数据出错 else if(temp.equals("(")) ; else if(temp.equals("-")) sk1.push(temp); else if(temp.equals("+")) sk1.push(temp); else if(temp.equals("/")) sk1.push(temp); else if(temp.equals(")")) { String x = sk1.pop(); double y = sk2.pop(); if(x.equals("+")) sk2.push(y + sk2.pop()); else if(x.equals("-")) sk2.push(y - sk2.pop()); else if(x.equals("*")) sk2.push(y * sk2.pop()); else if(x.equals("/")) sk2.push(sk2.pop() / y); } else { sk2.push(Double.parseDouble(temp)); } } return sk2.peek(); } public static void main(String[] args) { Main m = new Main(); String str ="(((1+2)*6)+4)"; System.out.println(m.Evaluate(str)); } }
另外一种是采用递归的方式
package leetcode; import java.util.Scanner; public class Main { private static int i = 0; //递归的方式:如(2+2)*(1+2)+9/2 分解为(2+2)这个表达式 (1+2)这个表达式 + 9/2这个表达式 //然后每个表达式进行递归取值 然后把所有的值加起来 private static int expression_value(String str) { //result 的作用是将表达式的第一个因子求出来 //因为i++ 随着递归不断增加 所以判断后面是什么符号 所以一开始在运算式后面再家一个空格的作用就在这里 int result = term_value(str); while (true) { //后面如果是加号的话进行加减 不考虑乘除 char temp = str.charAt(i) ; if (temp == '+' || temp == '-') { i++; //通过term_value 这个方法求解第二个因子 int value = term_value(str); if (temp == '+') result += value; else result -= value; } else break; } return result; } //求解因子的方法 private static int term_value(String str) { //调用了一个factor 这个方法 所有加减都要优先考虑乘除 更要先考虑括号 int result = factor_value(str); while (true) { char temp = str.charAt(i); if (temp == '*' || temp == '/' ) { i++; //继续调用factor方法去后面的值是否右有括号 除掉括号进行乘除 int value = factor_value(str); if (temp =='*') result *= value; else result /= value; } else break; } return result; } private static int factor_value(String str) { //进行括号内的运算 int result = 0; char temp = str.charAt(i); if (temp == '(') { i++; result = expression_value(str); i++; } else { while ( (temp - '0') >= 0 && (temp - '0') <= 9) { result = 10 * result + temp - '0'; i++; temp = str.charAt(i); } } return result; } //总结三个方法 //expression_value 方法是进行加减 //trem_value方法是进行乘除 //factor_value 方法是进行去括号 括号内又有表达式 表达式又有加减乘除 括号 所有继续调用 public static void main(String[] args) { Scanner sc = new Scanner (System.in); String s = sc.next()+" "; System.out.println(expression_value(s)); } }