java栈实现简易计算器算法

时间:2023-01-09 10:40:40

问题描述:

对于任意字符串,包含+ - * /和括号, 求出该表达式的值

首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如:

-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 }