Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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()