Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import re
- class Stack:
- def __init__(self):
- self.__data = [] #стек
- def push(self, element):
- self.__data.append(element) # добавление элемента на вершину стека(конец списка)
- def pop(self):
- return self.__data.pop() # удаляет верхний элемент из стека то есть с конца списка
- def topstack(self):
- return self.__data[len(self.__data)-1] # возвращает верхний эелемент стека
- def emptystack(self):
- return self.__data == [] # проверка стека на пустоту
- def size(self):
- return len(self.__data) # длинна стека
- class PoskaNotation:
- def __init__(self):
- self.operator_list = Stack()
- def notation(self,strin):
- privilege = {'(':1,'-':2,'+':2,"*":3,"/":3,"**":4} # задаем словарь с привилегиями для знаков
- postfix_in = [] # входной список
- string = re.findall('(\d+[,\.]?\d+|\S)', strin)# делаем из строки список по пробелу
- for i in string: # идем по списку
- if i.isdigit(): # провремяе число ли
- postfix_in.append(i) # числа заносим во входной список
- elif i == '(': # если встерчается открывающая
- self.operator_list.push(i) # добовляем в стек
- elif i == ')': # если встречаем закрывающую скобку
- top = self.operator_list.pop() # смотрим что на вершине стека
- while top != '(': # пока на вершине не окажется открывающая скобка
- postfix_in.append(top) #добавляем в конец входного списка
- top = self.operator_list.pop()
- else: # пока стек не пуст и приоритет оператора на вершине больше или равен привелегиям из словоря
- while (not self.operator_list.emptystack()) and (privilege[self.operator_list.topstack()] >= privilege[i]):
- postfix_in.append(self.operator_list.pop()) # выталкивать с вершины стека во входной список
- self.operator_list.push(i) #добавление значений из изначальной записи в конец стека
- while not self.operator_list.emptystack(): #пока не пуст стек выталкиваем все в входной список
- postfix_in.append(self.operator_list.pop())
- self.__result =" ".join(postfix_in) # результат преобразования, из списка в строку
- string1 = re.findall('(\d+[,\.]?\d+|\S)', self.__result)# делаем список из строки
- for i in string1: # идем по уже по постфиксной форме
- if i.isdigit():
- self.operator_list.push(int(i)) # добавляем в стек и преобразовываем в тип целочисленное
- else:
- op2 = self.operator_list.pop() #выталкиваем два числа, первое это op2 берем с вершины стека то есть с конца списка
- op1 = self.operator_list.pop() #так как в стек мы клали с конца а читаем мы слева на право, pop без индекса удаляет с конца списка
- result1 = self.operations(i,op1,op2)
- self.operator_list.push(result1) # отправляем в стек
- self.__result2 = self.operator_list.pop() #результат действий
- def operations(self,res,op1,op2): # считает
- if res == "*":
- result = op1 * op2
- return result
- elif res == "/":
- result = op1 / op2
- return result
- elif res == "+":
- result = op1 + op2
- return result
- elif res == "-":
- result = op1 - op2
- return result
- elif res == "**":
- result = op1 ** op2
- return result
- def info (self): # печать результатов
- print("Постфиксная форма = ", self.__result)
- print("Результат = ", self.__result2)
- c= PoskaNotation()
- c.notation("4+5*63")
- c.info()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement