50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
|
from typing import (
|
||
|
List,
|
||
|
)
|
||
|
|
||
|
from collections import deque
|
||
|
|
||
|
class Solution:
|
||
|
"""
|
||
|
@param expression: A string array
|
||
|
@return: The Reverse Polish notation of this expression
|
||
|
"""
|
||
|
def convert_to_r_p_n(self, expression: List[str]) -> List[str]:
|
||
|
op_priority = {
|
||
|
'/': 1 << 4,
|
||
|
'*': 1 << 4,
|
||
|
'+': 1 << 2,
|
||
|
'-': 1 << 2,
|
||
|
'(': 1 << 0
|
||
|
}
|
||
|
|
||
|
op_stack = deque()
|
||
|
result = []
|
||
|
|
||
|
for token in expression:
|
||
|
if token.isdigit():
|
||
|
result.append(token)
|
||
|
|
||
|
elif token == '(':
|
||
|
op_stack.append(token)
|
||
|
|
||
|
elif token == ')':
|
||
|
while len(op_stack) > 0 and op_stack[-1] != '(':
|
||
|
result.append(op_stack.pop())
|
||
|
|
||
|
op_stack.pop()
|
||
|
|
||
|
else:
|
||
|
# For any other operator, keep popping and appending to results as long as there
|
||
|
# are higher priority operators in the stack
|
||
|
while len(op_stack) > 0 and op_priority[op_stack[-1]] >= op_priority[token]:
|
||
|
result.append(op_stack.pop())
|
||
|
|
||
|
op_stack.append(token)
|
||
|
|
||
|
# Pop and append the remaining operators in the stack
|
||
|
while len(op_stack) > 0:
|
||
|
result.append(op_stack.pop())
|
||
|
|
||
|
return result
|