diff --git a/06-vyrazy/strom-vyrazu.py b/06-vyrazy/strom-vyrazu.py new file mode 100755 index 0000000000000000000000000000000000000000..d51cf03891a7e2c0faf4ee5277d72863370fa265 --- /dev/null +++ b/06-vyrazy/strom-vyrazu.py @@ -0,0 +1,52 @@ +#!/usr/bin/python3 + +class Node: + + def __init__(self, op, left=None, right=None): + self.op = op # Buď číslo nebo jméno operátoru + self.left = left + self.right = right + + def __str__(self): + if type(self.op) is int: + return str(self.op) + else: + return '(' + str(self.left) + self.op + str(self.right) + ')' + + def print_tree(self, level=0): + if self.right is not None: + self.right.print_tree(level+1) + print(" "*level, self.op) + if self.left is not None: + self.left.print_tree(level+1) + + def eval(self): + op = self.op + if type(op) is int: + return self.op + else: + l = self.left.eval() + r = self.right.eval() + if op == '+': + return l + r + if op == '-': + return l - r + if op == '*': + return l * r + if op == '/': + return l // r + raise NotImplemented() + + +x = Node('+', Node('*', Node(3), Node(4)), Node('-', Node(5), Node(6))) +print(x) +# x.print_tree() +# print(x.eval()) + +# Další úkoly: +# - doplnit unární operátory (třeba 'N' pro negaci) +# - počítání hloubky stromu +# - výpis stromu v postfixovém tvaru +# - převod postfixového tvaru na strom +# - výpis stromu v infixovém tvaru bez zbytečných závorek +# - prevod infixového tvaru na strom (*)