Advertisement
Guest User

calc2

a guest
Oct 20th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import re
  4.  
  5. class Stack:
  6.     def __init__(self):
  7.         self.__data = [] #стек
  8.  
  9.     def push(self, element):
  10.         self.__data.append(element) # добавление элемента на вершину стека(конец списка)
  11.  
  12.     def pop(self):
  13.         return self.__data.pop() # удаляет верхний элемент из стека то есть с конца списка
  14.  
  15.     def topstack(self):
  16.         return self.__data[len(self.__data)-1] # возвращает верхний эелемент стека
  17.  
  18.     def emptystack(self):
  19.         return self.__data == [] # проверка стека на пустоту
  20.  
  21.     def size(self):
  22.         return len(self.__data) # длинна стека
  23.  
  24. class PoskaNotation:
  25.     def __init__(self):
  26.         self.operator_list = Stack()
  27.     def notation(self,strin):
  28.         privilege = {'(':1,'-':2,'+':2,"*":3,"/":3,"**":4} # задаем словарь с привилегиями для знаков
  29.         postfix_in = [] # входной список
  30.         string =  re.findall('(\d+[,\.]?\d+|\S)', strin)# делаем из строки список по пробелу
  31.  
  32.         for i in string:        # идем по списку
  33.             if i.isdigit():     # провремяе число ли
  34.                 postfix_in.append(i) # числа заносим во входной список
  35.             elif i == '(':      # если встерчается открывающая
  36.                 self.operator_list.push(i) # добовляем в стек
  37.             elif i == ')':      # если встречаем закрывающую скобку
  38.                 top = self.operator_list.pop() # смотрим что на вершине стека
  39.                 while top != '(': # пока на вершине не окажется открывающая скобка
  40.                     postfix_in.append(top) #добавляем  в конец входного списка
  41.                     top = self.operator_list.pop()
  42.             else:                # пока стек не пуст  и приоритет оператора на вершине больше или равен привелегиям из словоря
  43.                 while (not self.operator_list.emptystack()) and (privilege[self.operator_list.topstack()] >= privilege[i]):
  44.                       postfix_in.append(self.operator_list.pop()) # выталкивать с вершины стека во входной список
  45.                 self.operator_list.push(i) #добавление значений из изначальной записи в конец стека
  46.  
  47.         while not self.operator_list.emptystack(): #пока не пуст стек выталкиваем все в входной список
  48.             postfix_in.append(self.operator_list.pop())
  49.             self.__result =" ".join(postfix_in) # результат преобразования,  из списка в строку
  50.  
  51.         string1 = re.findall('(\d+[,\.]?\d+|\S)', self.__result)# делаем список из строки
  52.         for i in string1: # идем по  уже по постфиксной форме
  53.             if i.isdigit():
  54.                 self.operator_list.push(int(i)) # добавляем в стек и преобразовываем в тип целочисленное
  55.             else:
  56.                 op2 = self.operator_list.pop()  #выталкиваем два числа, первое это op2  берем с вершины стека то есть с конца списка
  57.                 op1 = self.operator_list.pop()  #так как в стек мы клали с конца а читаем мы слева на право, pop без индекса удаляет с конца списка
  58.                 result1 = self.operations(i,op1,op2)
  59.                 self.operator_list.push(result1) #  отправляем в стек
  60.         self.__result2 = self.operator_list.pop() #результат действий
  61.  
  62.     def operations(self,res,op1,op2): # считает
  63.         if res == "*":
  64.             result = op1 * op2
  65.             return result
  66.         elif res == "/":
  67.             result = op1 / op2
  68.             return result
  69.         elif res == "+":
  70.             result = op1 + op2
  71.             return result
  72.         elif res == "-":
  73.             result = op1 - op2
  74.             return result
  75.         elif res == "**":
  76.             result = op1 ** op2
  77.             return result
  78.  
  79.     def info (self):  # печать результатов
  80.         print("Постфиксная форма = ", self.__result)
  81.         print("Результат = ", self.__result2)
  82.  
  83.  
  84. c= PoskaNotation()
  85. c.notation("4+5*63")
  86. c.info()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement