分析
首先将中缀表达式转换为后缀表达式(逆波兰式),然后使用栈进行计算。
没有考虑括号、小数。
代码
import java.util.LinkedList; import java.util.List; import java.util.Stack; public class ExpCal { public static double calc(String exp) { if (exp == null || exp.length() <= 0) { throw new IllegalArgumentException(); } char[] c = exp.toCharArray(); Stack<Character> s = new Stack<Character>(); List<String> reversePolishNotation = new LinkedList<String>(); for (int i = 0; i < c.length; ++i) { if (c[i] == '+' || c[i] == '-' || c[i] == '*' || c[i] == '/') { while (!s.isEmpty() && compOp(s.peek(), c[i]) >= 0) { reversePolishNotation.add(String.valueOf(s.pop())); } s.push(c[i]); } else { StringBuilder sb = new StringBuilder(); while (i < c.length && c[i] >= '0' && c[i] <= '9') { sb.append(c[i++]); } reversePolishNotation.add(sb.toString()); --i; } } while (!s.isEmpty()) { reversePolishNotation.add(String.valueOf(s.pop())); } Stack<Double> num = new Stack<Double>(); for (String e : reversePolishNotation) { if (e.equals("+")) { num.push(num.pop() + num.pop()); } else if (e.equals("-")) { double a = num.pop(); double b = num.pop(); num.push(b - a); } else if (e.equals("*")) { num.push(num.pop() * num.pop()); } else if (e.equals("/")) { double a = num.pop(); double b = num.pop(); num.push(b / a); } else { num.push(Double.parseDouble(e)); } } return num.pop(); } private static int compOp(char a, char b) { return getPri(a) - getPri(b); } private static int getPri(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } public static void main(String[] args) { System.out.println(calc("4*3+2*5-8/8-2*6/3+2/1-4")); } }
原文地址:http://blog.csdn.net/perfect8886/article/details/39369217