Обратная Польская Нотация 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])