首页 > 代码库 > IDG | 四则运算表达式计算
IDG | 四则运算表达式计算
分析
首先将中缀表达式转换为后缀表达式(逆波兰式),然后使用栈进行计算。
没有考虑括号、小数。
代码
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")); } }
IDG | 四则运算表达式计算
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。