-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransform_the_expression.py
64 lines (48 loc) · 1.43 KB
/
transform_the_expression.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def operation_priorities():
return {
'+': 0,
'-': 1,
'*': 2,
'/': 3,
'^': 4
}
def process_operator(curr_operator, operators, priorities):
rpn = ''
prev_operator = operators.pop() if len(operators) > 0 else None
while prev_operator is not None \
and priorities[prev_operator] >= priorities[curr_operator]:
rpn += prev_operator
prev_operator = operators.pop() if len(operators) > 0 else None
if prev_operator is not None:
operators.append(prev_operator)
operators.append(curr_operator)
return rpn
def to_rpn(expression, start=0):
priorities = operation_priorities()
operators = []
rpn = ''
i = start
if expression[i] == '(':
i += 1
while i < len(expression):
symbol = expression[i]
if symbol == '(':
inner_rpn_length, inner_rpn = to_rpn(expression, i)
i += inner_rpn_length
rpn += inner_rpn
elif symbol == ')':
i += 1
break
elif symbol.isalpha():
rpn += symbol
i += 1
else:
rpn += process_operator(symbol, operators, priorities)
i += 1
rpn += ''.join(reversed(operators))
return (i - start, rpn)
def run():
test_cases = int(input())
expressions = [input() for _ in range(test_cases)]
print('\n'.join(map(lambda x: to_rpn(x)[1], expressions)))
run()