Форум сайта python.su
perators = ["+", "-",] operators1 = ["*", "/"] def priority(operator): if operator in operators: x = 1 if operator in operators1: x = 2 return x def transformation(expression): l = [] s = '' n = 0 for i in expression: if i.isdigit(): s = s + i n = n + 1 if i in operators or i in operators1: l.append(s) s = '' l.append(i) n = n + 1 if len(expression) == n: l.append(s) return l def polish_notation(): exit = [] stack = [] list = transformation("8+4*3-2*2+9*9*2") #Цикл, отвечащий за преобразование в нотацию for i in list: #Если операнда кидаем на выход if i.isdigit(): exit.append(int(i)) #Cдесь обрабываем операторы else: #Если это первый оператор, то кидаем в стек if len(stack) == 0: stack.append(i) #Если нет, то кидаем его в стек и сравниваем приоритеты, пока стек имеет 2 и более элементов. #Если приоритет предпоследнего оператора в стеке больше или равен, то кидаем предпоследний элемент на выход else: stack.append(i) while len(stack)>1 and priority(stack[-2]) >= priority(stack[-1]): exit.append(stack.pop(-2)) #Если мы обрабатываем последний элемент, то выгружаем стек. if i is list[-1]: while len(stack)>0: exit.append(stack.pop()) print(exit) print(stack) return exit
Отредактировано Python_newbie13 (Июнь 27, 2020 19:57:00)
Офлайн
Нашел ошибку.
if i is list[-1]:
Офлайн
Возникает вопрос. Как проверить, что это последний элемент списка? Я использую переменную счетчик
for i in list: n = n + 1 if n == len(list): do smth
Отредактировано Python_newbie13 (Июнь 28, 2020 19:19:43)
Офлайн
Python_newbie13Тут нужно не в pythonic смотреть, а в алгоритм. Проверить, является ли взятый элемент последним, можно по той структуре данных, из которой он берётся. Соответственно, тебе нужно поместить элементы в очередь и брать из неё по элементу. Когда взятый элемент окажется последним, очередь станет пустой и это можно будет проверить.
Есть ли боле pythonic решения?
>>> queue = [1, 2, 3, 4, 5] >>> >>> while queue: ... e = queue.pop(0) ... print('See element:', e) ... if not queue: ... print('See last element:', e) ... See element: 1 See element: 2 See element: 3 See element: 4 See element: 5 See last element: 5 >>>
'1*1*1*1'
'1+1+1+1'
'1+1*1+1'
'1+1+1'
Отредактировано py.user.next (Июнь 29, 2020 00:22:13)
Офлайн
Спасибо за совет про дебагер. Будет полезно на будущее. Используя его, я бы разобрался намного быстрее. Проверка с помощью очереди тоже лучше, чем мой вариант через переменную счетчик.
После того, как я добавил в алгоритм скобки он стал еще сложнее, но сейчас все работает, как надо.
Отредактировано Python_newbie13 (Июнь 29, 2020 03:35:08)
Офлайн