|
1 | 1 | class Solution { |
2 | 2 | public boolean parseBoolExpr(String expression) { |
3 | | - char[] chars = expression.toCharArray(); |
4 | | - Stack<Character> operations = new Stack<>(); |
5 | | - Stack<Character> boolValues = new Stack<>(); |
6 | | - |
7 | | - for (int i = 0; i < chars.length; i++) { |
8 | | - char c = chars[i]; |
9 | | - if (c == '!' || c == '&' || c == '|') { |
10 | | - operations.push(c); |
11 | | - } |
12 | | - else if (c == '(') { |
13 | | - boolValues.push('#'); |
14 | | - } |
15 | | - else if (c == 't' || c == 'f') { |
16 | | - boolValues.push(chars[i]); |
17 | | - } |
18 | | - else if (c == ',') { |
19 | | - continue; |
20 | | - } |
21 | | - else { |
22 | | - List<Character> list = new ArrayList<>(); |
23 | | - while (!boolValues.isEmpty()) { |
24 | | - char temp = boolValues.pop(); |
25 | | - if (temp == '#') { |
26 | | - break; |
27 | | - } |
28 | | - |
29 | | - list.add(temp); |
| 3 | + Stack<Character> stack = new Stack<>(); |
| 4 | + for (char c : expression.toCharArray()) { |
| 5 | + if (c == ')') { |
| 6 | + List<Character> values = new ArrayList<>(); |
| 7 | + while (stack.peek() != '(') { |
| 8 | + values.add(stack.pop()); |
30 | 9 | } |
31 | | - |
32 | | - boolValues.push(performOperation(list, operations.pop())); |
| 10 | + stack.pop(); |
| 11 | + char operation = stack.pop(); |
| 12 | + char result = evaluate(operation, values); |
| 13 | + stack.push(result); |
| 14 | + } else if (c != ',') { |
| 15 | + stack.push(c); |
33 | 16 | } |
34 | 17 | } |
35 | | - |
36 | | - return boolValues.peek() == 't' ? true : false; |
| 18 | + return stack.peek() == 't'; |
37 | 19 | } |
38 | 20 |
|
39 | | - private Character performOperation(List<Character> list, Character operation) { |
40 | | - if (operation == '|') { |
41 | | - return performOr(list); |
42 | | - } |
43 | | - else if (operation == '&') { |
44 | | - return performAnd(list); |
| 21 | + private static char evaluate(char operation, List<Character> values) { |
| 22 | + if (operation == '!') { |
| 23 | + return values.get(0) == 't' ? 'f' : 't'; |
45 | 24 | } |
46 | | - else { |
47 | | - return list.get(0) == 't' ? 'f' : 't'; |
48 | | - } |
49 | | - } |
50 | | - |
51 | | - private Character performAnd(List<Character> list) { |
52 | | - boolean val = getBooleanValue(list.get(0)); |
53 | | - for (int i = 1; i < list.size(); i++) { |
54 | | - val &= getBooleanValue(list.get(i)); |
| 25 | + if (operation == '&') { |
| 26 | + for (char value : values) { |
| 27 | + if (value == 'f') { |
| 28 | + return 'f'; |
| 29 | + } |
| 30 | + } |
| 31 | + return 't'; |
55 | 32 | } |
56 | | - |
57 | | - return val ? 't' : 'f'; |
58 | | - } |
59 | | - |
60 | | - private Character performOr(List<Character> list) { |
61 | | - boolean val = getBooleanValue(list.get(0)); |
62 | | - for (int i = 1; i < list.size(); i++) { |
63 | | - val |= getBooleanValue(list.get(i)); |
| 33 | + if (operation == '|') { |
| 34 | + for (char value : values) { |
| 35 | + if (value == 't') { |
| 36 | + return 't'; |
| 37 | + } |
| 38 | + } |
| 39 | + return 'f'; |
64 | 40 | } |
65 | | - |
66 | | - return val ? 't' : 'f'; |
67 | | - } |
68 | | - |
69 | | - private boolean getBooleanValue(Character character) { |
70 | | - return character == 't' ? true : false; |
| 41 | + return 'f'; |
71 | 42 | } |
72 | 43 | } |
0 commit comments