def balance_parens(infix_string): valid_ops = ["+", "-", "*", "/"] opstack = Stack() output = list() infix_string = infix_string.split() for char in infix_string: if char == "(": opstack.push(char) elif char == ")": opstack.pop() elif char in valid_ops: opstack.append(char) return output
def calculator(str): expression = [] #list numbers = [] operator = Stack() #stack ranking = {'+': 1, '-': 1, '*': 2, '/': 2} middle_num = 0 right_num = 0 left_num = 0 # 담기 #숫자 : 배열에 넣기 #기호(맨 위 연산자보다 우선순위가 낮거나 같을 때 ) : 기존 값들을 배열에, 본인은 스택에 #기호(우선순위 높을 때) : 스택에 본인 값 저장 for s in str: if s.isdigit(): expression.append(s) elif s in ranking.keys(): if len(operator) == 0: operator.append(s) elif ranking[s] <= ranking[operator.peek()]: while operator: expression.append(operator.pop()) operator.push(s) else: operator.push(s) # 남은 기호들 배열에 넣기 while operator: expression.append(operator.pop()) # 계산하기 for e in expression: if e.isdigit(): numbers.push(e) else: right_num = int(numbers.pop()) left_num = int(numbers.pop()) if e == '+': middle_num = left_num + right_num elif e == '-': middle_num = left_num - right_num elif e == '*': middle_num = left_num * right_num elif e == '/': middle_num = left_num / right_num numbers.push(middle_num) return numbers.pop()