Skip to content

Commit a3143e2

Browse files
authored
Update Parsing A Boolean Expression.java
1 parent 3a2e60d commit a3143e2

File tree

1 file changed

+31
-60
lines changed

1 file changed

+31
-60
lines changed
Lines changed: 31 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,43 @@
11
class Solution {
22
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());
309
}
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);
3316
}
3417
}
35-
36-
return boolValues.peek() == 't' ? true : false;
18+
return stack.peek() == 't';
3719
}
3820

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';
4524
}
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';
5532
}
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';
6440
}
65-
66-
return val ? 't' : 'f';
67-
}
68-
69-
private boolean getBooleanValue(Character character) {
70-
return character == 't' ? true : false;
41+
return 'f';
7142
}
7243
}

0 commit comments

Comments
 (0)