Как сделать, чтобы действия в скобках выполнялись первыми?

Рейтинг: 2Ответов: 1Опубликовано: 17.05.2023

Делаю калькулятор на питоне. Но не могу понять, как осуществить, чтобы действия в скобках выполнялись первыми? Например: ( 6 + 5 ) * 2 - вывод 22

# Раскладываем выражения на токены
def tokinizer(expression):
    tokens = expression.split()
    parser(tokens)


# Парсим разделённое выражение
def parser(token):
    # / -> 
    # * -> 
    # + -> -
    
    # Если длинна токена больше 1, то продолжаем парсить, иначе выводим результат
    if len(token) > 1:
        if "/" in token:
             operator = "/"
             #получаем индекс operator в выражении
             operIndex = token.index(operator)
             # цифра слева от operator
             leftNumber = token[operIndex - 1]
             # цифра справа от operator
             rightNumber = token[operIndex + 1]
             # удаляем забранные символы
             token.remove(leftNumber)
             token.remove(rightNumber)
             token.remove(operator)
             
             calculate(operator, leftNumber, rightNumber, token)
         
        elif "*" in token:
            operator = "*"
            operIndex = token.index(operator)
            leftNumber = token[operIndex - 1]
            rightNumber = token[operIndex + 1]
            token.remove(leftNumber)
            token.remove(rightNumber)
            token.remove(operator)
            
            calculate(operator, leftNumber, rightNumber, token)
            
        elif "+" in token:
            operator = "+"
            operIndex = token.index(operator)
            leftNumber = token[operIndex - 1]
            rightNumber = token[operIndex + 1]
            token.remove(leftNumber)
            token.remove(rightNumber)
            token.remove(operator)
            
            calculate(operator, leftNumber, rightNumber, token)
            
        elif "-" in token:
            operator = "-"
            operIndex = token.index(operator)
            leftNumber = token[operIndex - 1]
            rightNumber = token[operIndex + 1]
            token.remove(leftNumber)
            token.remove(rightNumber)
            token.remove(operator)
            
            calculate(operator, leftNumber, rightNumber, token)
            
    else:
         print(*token)


def calculate(operator, firstNumber, secondNumber, token):
    # логика деления
    if operator == "/":
        expr = [str(float(firstNumber) / float(secondNumber))]
        new_token = expr + token
        parser(new_token)
    
    # логика умножения
    elif operator == "*":
        expr = [str(float(firstNumber) * float(secondNumber))]
        new_token = expr + token
        parser(new_token)
     
    # логика сложения   
    elif operator == "+":
        expr = [str(float(firstNumber) + float(secondNumber))]
        new_token = expr + token
        parser(new_token)
    
    # логика вычитания     
    elif operator == "-":
        expr = [str(float(firstNumber) - float(secondNumber))]
        new_token = expr + token
        parser(new_token)


if __name__ == "__main__":
    while True:
        expr = input(">> ")
        tokinizer(expr)

Ответы

▲ 3

Отыщите в выражении любую пару круглых скобок так, чтобы между ними скобок не было. Выражение между скобками вычислите рекурсивно. Замените скобки и всё что между ними на вычисленное значение. Повторяйте пока в выражении есть скобки. В конце вычислите выражение без скобок.

P.S. Калькуляторы не пишут так как вы собрались делать. Это старая тема и в ней есть хорошо проработанный подход - алгоритм сортировочной станции.