package t2; //一直想去实现这个算法,直到今天才将它写出来,主要目的是为了计算此种表达式 ((1+1)*2+2)*3 // //java代码如下: ///Tn.java /// import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Tn { // 操作符数组,优先级从低到高 private static String[] operas = { "#", "+-", "*/", "%^" }; public static String test(String s) { if (null == s) return ""; s += "#"; Pattern num = Pattern.compile("^(//d+(//.//d+)?)(.*)"); Matcher matcher; Stack<String> s1 = new Stack<String>(); Stack<String> s2 = new Stack<String>(); char ch; while (s.length() > 0) { matcher = num.matcher(s); // 判断开头是否是数字 if (matcher.find()) { s2.add(matcher.replaceAll("$1")); s = matcher.replaceAll("$3"); } else { ch = s.charAt(0); s = s.substring(1); // // // / 优先级 '(' ')' // / if ('(' == ch) { s1.add("" + ch); continue; } else if (ch == ')') { while (!s1.isEmpty() && !("(").equals(s1.peek())) { s2.add(calc(s2.pop(), s1.pop().charAt(0), s2.pop())); } if (!s1.isEmpty()) s1.pop(); continue; } // // / 计算表达式 // /// if (isOpea(ch)) { while (true) { if (!s1.isEmpty() && yxj("" + ch, s1.peek())) { s2 .add(calc(s2.pop(), s1.pop().charAt(0), s2 .pop())); } else { s1.add("" + ch); break; } } } else { throw new RuntimeException("表达式非法!!"); } } } return s2.pop(); } /** * 判断一个字符是否是操作符 * * @param ch * 需要判断的字符 * @return 如果是操作符返回 true 否则返回 false */ private static boolean isOpea(char ch) { for (String str : operas) { if (str.indexOf(ch) != -1) return true; } return false; } /** * 比较操作符的优先级 * * @param str * 第一个操作符 * @param str1 * 第二个操作符 * @return 第一个操作符的优先级高于第二个操作符 返回false 否则返回 true */ private static boolean yxj(String str, String str1) { int s1 = 0, s2 = 0; for (int i = 0; i < operas.length; i++) { if (operas[i].indexOf(str) > -1) { s1 = i; } if (operas[i].indexOf(str1) > -1) { s2 = i; } } return s2 >= s1; } /** * 计算 * * @param s1 * 操作数1 * @param c * 操作符 * @param s2 * 操作数2 * @return 返回操作数1和操作数2 经过操作符 c 运算后的结果 */ private static String calc(String s1, char c, String s2) { String result = "0"; Double d1 = Double.parseDouble(s1); Double d2 = Double.parseDouble(s2); switch (c) { case '+': result = "" + (d1 + d2); break; case '-': result = "" + (d2 - d1); break; case '*': result = "" + (d1 * d2); break; case '/': result = "" + (d2 / d1); break; case '%': result = "" + (d2 % d1); break; case '^': result = "" + (Math.pow(d2, d1)); break; } return result; } public static void main(String[] args) { System.out.println(test("((1+1)*2+2)*3")); } }