1. 程式人生 > >java棧實現簡易計算器算法

java棧實現簡易計算器算法

return string 計算 bsp emp java棧 ava empty pan

問題描述:

對於任意字符串,包含+ - * /和括號, 求出該表達式的值

首先百度該問題,網上有不少答案,但是實際思考,發現,很多答案沒有考慮完全,例如:

-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 System.out.println("line 47 temp is " + temp); 50 while (isNumber(s.charAt(++i))) 51 temp += s.charAt(i); 52 System.out.println("line 50 temp is " + temp); 53 for (int jj = 0; jj < temp.length(); ++jj) { 54 Temp = Temp * 10 + temp.charAt(jj) - 48; 55 } 56 System.out.println("line 54 Temp is " + Temp); 57 if (flag) { 58 Temp *= -1; 59 flag = !flag; 60 } 61 number.push(Temp); 62 temp = null; 63 } 64 if (!isNumber(s.charAt(i))) { 65 if (((s.charAt(i) == ‘-‘) && !flag) || (s.charAt(i) != ‘-‘)) { 66 if (operate.empty()) { 67 operate.push(s.charAt(i)); 68 } else { 69 top = operate.peek(); 70 if (priority(s.charAt(i)) > priority(top) || s.charAt(i) == ‘(‘) { 71 operate.push(s.charAt(i)); 72 } else { 73 while (priority(s.charAt(i)) <= priority(top)) { 74 if (top == ‘#‘ && s.charAt(i) == ‘#‘) { 75 int answer; 76 operate.pop(); 77 answer = number.peek(); 78 number.pop(); 79 System.out.println("line 69 answer is " + answer); 80 return answer; 81 } else if (top == ‘(‘ && s.charAt(i) == ‘)‘) { 82 ++i; 83 } else { 84 a = number.peek(); 85 number.pop(); 86 b = number.peek(); 87 number.pop(); 88 System.out.println("line 78 a is " + a + ", b is " + b); 89 } 90 if (top == ‘+‘) { 91 b += a; 92 number.push(b); 93 } else if (top == ‘-‘) { 94 b -= a; 95 number.push(b); 96 } else if (top == ‘*‘) { 97 b *= a; 98 number.push(b); 99 } else if (top == ‘/‘) { 100 b /= a; 101 number.push(b); 102 } 103 operate.pop(); 104 top = operate.peek(); 105 } 106 System.out.println("line 96 s[i] is " + s.charAt(i)); 107 operate.push(s.charAt(i)); 108 } 109 } 110 } 111 } 112 } 113 114 return 0; 115 } 116 117 public static void main(String[] args) { 118 String s = new String("#(1+2)+(-2*2)+(-2*6)#"); 119 int answer = calculte(s); 120 System.out.println("the answer is " + answer); 121 } 122 }

java棧實現簡易計算器算法