|
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