Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.33 KB | None | 0 0
  1.  
  2. #cod care face converteste ecuatie in binary tree
  3. # in prima faza m-am gandit ca trebuie sa transform ecuatie din forma infix in prefix ca e mai usor de citit de AI
  4. # ex : INPUT: A * B + C / D
  5. #      OUTPUT: + * A B / C D ("+"" e radacina care are ca si copii pe "*"" si pe "A" , dupa "*" are ca si copii pe "B" si pe "/", "/" pe "C" si "D")
  6. # ideea e ca cifra nu are voie sa aiba copii (trebuie sa fie frunza)
  7. class binary_tree:
  8.     def __init__(self,expr):
  9.         # ar trebui sa reprezinte radacina si subtrees, l fiind element din stanga si r cel din dreapta
  10.         self.expr = expr
  11.         self.l = None
  12.         self.r = None
  13.  
  14. class Stack:
  15.     def __init__(self):
  16.         self.ary = []
  17.     def isEmpty(self):
  18.         return self.ary == []
  19.     def push(self,i):
  20.         self.ary.append(i)
  21.     def pop(self):
  22.         if not self.isEmpty():
  23.             return self.ary.pop()
  24.         else:
  25.             return None
  26.     def top_el(self):
  27.         return self.ary[len(self.ary)-1]
  28.  
  29. def is_operator(char):
  30.     if char == "+" or char == "-" or char == "/" or char == "*":
  31.         return True
  32.     else:
  33.         return False
  34. # inmultit si impartit > adunat si scazut
  35. def precedence(char):
  36.     if char == "/" or char == "*":
  37.         return 1
  38.     else:
  39.         return 0
  40.    
  41. def infix_to_prefix(expr):
  42.     stack = Stack()
  43.     operator_s = Stack()
  44.     numbers = "0123456789"
  45.     for char in expr:
  46.         if char in numbers:
  47.             #daca e numar, fa obiect fara copii si baga-l in stack
  48.             et = binary_tree(char)
  49.             stack.push(et)
  50.         elif is_operator(char):
  51.             #daca characteru e / sau * si cel din topu stack-ului e + sau - fa obiect fara copii si baga-l in stack
  52.             if precedence(char) > precedence(stack.top_el()):
  53.                 et = binary_tree(char)
  54.                 operator_s.push(et)
  55.             #daca e caz contrar, fa din operator un obiect care are ca si copii ultimii 2 operanti din stack, si fa asta pana stack-ul de operatori e gol
  56.             elif precedence(char) <= precedence(stack.top_el()):
  57.                 while not operator_s.isEmpty():
  58.                     et = binary_tree(operator_s.top_el())
  59.                     et.r = stack.pop()
  60.                     et.l = stack.pop()
  61.                     stack.push(et)
  62.     return stack
  63.  
  64. print(infix_to_prefix("2+3/5+4"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement