Guest User

Untitled

a guest
May 17th, 2017
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.83 KB | None | 0 0
  1. OPERATORS = {'+': (1, lambda x, y: x + y), '-': (1, lambda x, y: x - y),
  2.              '*': (2, lambda x, y: x * y), '/': (2, lambda x, y: x / y),
  3.              'unary_minus': (3, lambda x: -1*x),}
  4.  
  5. def parse(line):
  6.     num = ''
  7.     for symbol in line:
  8.         if symbol in OPERATORS or symbol in '()':
  9.             if num:
  10.                 yield float(num)
  11.                 yield symbol
  12.                 num=''
  13.             else:
  14.                 if symbol=='-':
  15.                     yield 'unary_minus'
  16.                 else:
  17.                     yield symbol
  18.         else:
  19.             num+=symbol
  20.     if num:
  21.         yield float(num)
  22.  
  23. def sort(parsed):
  24.     tmp = []
  25.     for i in parsed:
  26.         if i in OPERATORS:
  27.             while tmp and tmp[-1] != '(' and OPERATORS[i][0] <= OPERATORS[tmp[-1]][0]:
  28.                 yield tmp.pop()
  29.             tmp.append(i)
  30.         elif i == ')':
  31.             while tmp:
  32.                 x = tmp.pop()
  33.                 if x == '(':
  34.                     break
  35.                 yield x
  36.         elif i == '(':
  37.             tmp.append(i)
  38.         else:
  39.             yield i
  40.     while tmp:
  41.         yield tmp.pop()
  42.  
  43. def calc(sort):
  44.     tmp = []
  45.     for i in sort:
  46.         if i in OPERATORS:
  47.             if i=='unary_minus':
  48.                 x = tmp.pop()
  49.                 tmp.append(OPERATORS[i][1](x))
  50.             else:
  51.                 y = tmp.pop()
  52.                 x = tmp.pop()
  53.                 tmp.append(OPERATORS[i][1](x, y))
  54.         else:
  55.             tmp.append(i)
  56.     return tmp[0]
  57.  
  58. for formula in ['2+2*2','-(4+10)/2','10-(2*5)']:
  59.     print formula,'= ', calc(sort(parse(formula)))
  60.     pass
  61.  
  62. for formula in ['-(4+10)/2','10-(2*5)','-2+10','10+(-2*5)']:
  63.     #print formula,'= ', list(parse(formula)), ', '#,list(sort(parse(formula)))
  64.     pass
  65.     print formula,'= ', calc(sort(parse(formula)))
Advertisement
Add Comment
Please, Sign In to add comment