Обратная Польская Нотация RPN

Сдавал лабу, готовил два дня на коленке, но лаборант принял за 5 минут и тут же ушел к другому (нынче у нас локдаун, так что с этим все сложнее). Поскольку не получил отдачи на код ВООБЩЕ НИКАКОЙ, прошу придраться к коду, максимально, но объективно. Если кто-то сможет заменить куски, или указать, что стоило сделать, буду благодарен.

PS: я НЕ прошу сделать лабу за меня - я её уже сдал. Но считаю, что только получил галочку, поэтому и пишу сюда - хочу научиться и понять. Да, код, мягко говоря, "на ахти", но так вышло.

#+Доп.задача (ОБЯЗАТЕЛЬНО!): доделать () //!сделал, но есть ошибки!
#            (ОБЯЗАТЕЛЬНО!): реализовать проверку корректности! (не то число скобок {~v} и операндов {x}: (a*b)+)
#Доп.задача  (жалательно)  : сделать разделение лексем (14+1 = 14_1+)
#Доп.задача  (доп-балл)    : вычисления + вычисления с участием букв (где возможно)
 
priority = [['+','-'],['*','/'],['^']]
 
def get_priority(operator):
    i = 1
    for operators in priority:
        if operator in operators:
            return i
        i+=1
    return -1
 
def is_operator(char):
    for operators in priority:
        for operator in operators:
            if char == operator:
                return True
    return False
 
error0 = 'Не совпадает количество открывающихся и закрывающихся скобок!'
error1 = 'Нет опреанда!' #использование не реализовано
error2 = 'Оператор не может следовать за другим оператором!' #использование не реализовано
message0 = 'Строка успешно сконвертирована в Обратную Польскую Нотацию :)'
 
def RPN(inp_str): #Reverse Polish notation
    stack = []
    res_str = ''
    for char in inp_str:
        #стек операций пуст
        if len(stack) == 0:
            if is_operator(char) or char == '(' or char == ')':
                stack.append(char)
            else:
                if not char == '(' and not char ==')':
                    res_str+=char
        #стек операций не пуст
        else:
            if is_operator(char) and not (char == '(' or char == ')'):
                if get_priority(char) >= get_priority(stack[-1]):
                    stack.append(char)
                if get_priority(char) < get_priority(stack[-1]):
                    for stack_op in reversed(stack):
                        if get_priority(char) <= get_priority(stack_op):
                            #если приоритет текущей операции ниже, чем стековой,
                            #она выталкивает из стека все операции с >= приоритетом в вых. строку
                            res_str+=stack.pop()
                    stack.append(char)
            elif char == ')':
                    #скобка выталкивает из стека все операции до ( в вых. строку
                    for stack_rev_op in reversed(stack.copy()):                        
                        if stack_rev_op == '(':
                            stack.pop()
                            break
                        else:
                            res_str+=stack.pop()
            elif char == '(':
                #( кладется в сетк
                stack.append(char)
            elif char != '(' and char != ')':
                #не опреаторы кладутся в строку
                res_str+=char
    #проверка на неравное число ()
    if '(' in stack or ')' in stack:
        return [error0,'']
    #докидываем все оставшиеся операторы из стека в вых. строку
    for operator in reversed(stack):
        if not (operator == '(' or operator == ')'):
            res_str+=operator
    return [message0,res_str]
 
while True:
    #RPN возвращает информацию об успешности преобразования и преобразованную строку в RPN
    res = RPN(inp_str = input('Введите выражение: '))
    if res[0] == message0:
        print(res[1])
    else:
        print(res[0])

Ответы (0 шт):