问题描述:
对于任意字符串,包含+ - * /和括号, 求出该表达式的值
首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如:
-1+(-2)*3 遇到负号怎么办?
现贴出代码如下:
1 package calcultor; 2 3 import java.util.Stack; 4 5 public class Calcultor { 6 7 static boolean isNumber(char x) { 8 if (x >= '0' && x <= '9') { 9 return true; 10 } 11 return false; 12 } 13 14 static int priority(char x) { 15 if (x == '+' || x == '-') { 16 return 0; 17 } else if (x == '*' || x == '/') { 18 return 1; 19 } else if (x == '(' || x == ')') { 20 return -1; 21 } else if (x == '#') { 22 return -2; 23 } 24 25 return -3; 26 } 27 28 public static int calculte(String s) { 29 Stack<Integer> number = new Stack<Integer>(); 30 Stack<Character> operate = new Stack<Character>(); 31 char top; 32 int a = 0, b = 0; 33 int j = 0; 34 boolean flag = false; 35 for (int i = 0; i < s.length(); ++i) { 36 if (s.charAt(1) == '-') { 37 flag = true; 38 } 39 if (i >= 2 && i <= s.length() - 2) { 40 j = i; 41 if (!isNumber(s.charAt(j - 1)) && s.charAt(i) == '-' && isNumber(s.charAt(j + 1))) { 42 flag = true; 43 } 44 } 45 if (isNumber(s.charAt(i))) { 46 int Temp = 0; 47 String temp = ""; 48 temp += s.charAt(i); 49 while (isNumber(s.charAt(++i))) 50 temp += s.charAt(i); 51 for (int jj = 0; jj < temp.length(); ++jj) { 52 Temp = Temp * 10 + temp.charAt(jj) - 48; 53 } 54 if (flag) { 55 Temp *= -1; 56 flag = !flag; 57 } 58 number.push(Temp); 59 temp = null; 60 } 61 if (!isNumber(s.charAt(i))) { 62 if (((s.charAt(i) == '-') && !flag) || (s.charAt(i) != '-')) { 63 if (operate.empty()) { 64 operate.push(s.charAt(i)); 65 } else { 66 top = operate.peek(); 67 if (priority(s.charAt(i)) > priority(top) || s.charAt(i) == '(') { 68 operate.push(s.charAt(i)); 69 } else { 70 while (priority(s.charAt(i)) <= priority(top)) { 71 if (top == '#' && s.charAt(i) == '#') { 72 int answer; 73 operate.pop(); 74 answer = number.peek(); 75 number.pop(); 76 return answer; 77 } else if (top == '(' && s.charAt(i) == ')') { 78 ++i; 79 } else { 80 a = number.peek(); 81 number.pop(); 82 b = number.peek(); 83 number.pop(); 84 } 85 if (top == '+') { 86 b += a; 87 number.push(b); 88 } else if (top == '-') { 89 b -= a; 90 number.push(b); 91 } else if (top == '*') { 92 b *= a; 93 number.push(b); 94 } else if (top == '/') { 95 b /= a; 96 number.push(b); 97 } 98 operate.pop(); 99 top = operate.peek(); 100 } 101 operate.push(s.charAt(i)); 102 } 103 } 104 } 105 } 106 } 107 108 return 0; 109 } 110 111 public static void main(String[] args) { 112 String s = new String("#(1+2)+6/3+(-2*2)+(-2*6)#"); 113 int answer = calculte(s); 114 System.out.println("the answer is " + answer); 115 } 116 }