/* *题目 *例如:求字符串表达式“4+6/2*4-45”等于多少? */ import java.util.*; public class CaculateStr { private static String[] s = { "+", "-", "*", "/" }; // +,-,*,/的优先级比对表 private static String[][] tabel = { { "<", "<", ">", ">" }, { "<", "<", ">", ">" }, { "<", "<", "<", "<" }, { "<", "<", "<", "<" } }; public static String compareLevel(String a, String b) { int row = 0; int col = 0; for (int i = 0; i < 4; i++) if (s[i].equals(a)) col = i; for (int i = 0; i < 4; i++) if (s[i].equals(b)) row = i; return tabel[row][col]; } public static float caculate(String s) { try { boolean flag = false;// 起标识作用,决定该不该取出numbers众的数字入num_stack栈 StringTokenizer st = new StringTokenizer(s, "+-*/"); // 存放所有的参与运算的数字 List<Float> numbers = new ArrayList<Float>(); // 存放所有的运算符 List<String> symbols = new ArrayList<String>(); // 数字栈 Stack<Float> num_stack = new Stack<Float>(); // 运算符栈 Stack<String> sym_stack = new Stack<String>(); // 逐个把参与运算的数字存储到numbers里面 while (st.hasMoreTokens()) { numbers.add(Float.parseFloat(st.nextToken())); } // 逐个把运算符存储到symbols里面 for (int i = 0; i < s.length(); i++) { String temp = s.substring(i, i + 1); if (temp.equals("+") || temp.equals("-") || temp.equals("*") || temp.equals("/")) { symbols.add(temp); } } // 满足一下条件之一继续执行 // 符号栈没有空、数字栈栈内元素多于一个、numbers没有空、symbols没有空 while (sym_stack.isEmpty() == false || num_stack.size() > 1 || numbers.isEmpty() == false || symbols.isEmpty() == false) { // flag为false从numbers中取第一个数字 入num_stack栈 if (flag == false) { num_stack.add(numbers.get(0)); numbers.remove(0); } // 如果符号栈为空,从symbols中取第一个运算符如入sym_stack栈 // 并从numbers中取第一个数字 入num_stack栈 if (sym_stack.isEmpty()) { sym_stack.add(symbols.get(0)); symbols.remove(0); num_stack.add(numbers.get(0)); numbers.remove(0); } // 运算符用完 或者 // 后面一个运算符优先级小于运算符栈顶元素的优先级,如:“-”的优先级小于“*” // 取出数字栈栈顶两个数进行运算 if (symbols.isEmpty() || compareLevel(symbols.get(0), sym_stack.get(sym_stack.size() - 1)) .equals("<")) { flag = true; Float a = num_stack.get(num_stack.size() - 1); num_stack.remove(num_stack.size() - 1); Float b = num_stack.get(num_stack.size() - 1); num_stack.remove(num_stack.size() - 1); String sym = sym_stack.get(sym_stack.size() - 1); sym_stack.remove(sym_stack.size() - 1); if (sym.equals("+")) { num_stack.add(b + a); } else if (sym.equals("-")) { num_stack.add(b - a); } else if (sym.equals("*")) { num_stack.add(b * a); } else if (sym.equals("/")) { num_stack.add(b / a); } } else {// 从symbols中取第一个运算符入sym_stack栈 flag = false; sym_stack.add(symbols.get(0)); symbols.remove(0); } } return num_stack.get(num_stack.size() - 1); } catch (Exception e) { System.out.println("检查输入字符串是否符合算术表达式标准!"); e.printStackTrace(); return 0f; } } public static void main(String[] args) { String s = "3*2+8/2*5/5+7-8"; System.out.println(s + "=" + caculate(s)); } }