def calculate(self):

        prefix_notation = self.split_prefix_notation(self.prefix_notation)
        #prefix_notation.print_to_console()
        #print('\n')

        stack = Stack()
        list_elem = prefix_notation.tail

        for _ in range(prefix_notation.get_size(), 0, -1):

            if list_elem.value == 'pi' or list_elem.value == 'e' or list_elem.value[
                    0].isdigit(
                    ) or list_elem.value == '-pi' or list_elem.value == '-e' or (
                        list_elem.value[0] == '-' and len(list_elem.value) > 1
                        and not (str(self.functions.search(
                            list_elem.value)).isdigit())):

                if list_elem.value == 'pi':
                    stack.push(pi)
                elif list_elem.value == 'e':
                    stack.push(e)
                elif list_elem.value == '-pi':
                    stack.push(-pi)
                elif list_elem.value == '-e':
                    stack.push(-e)
                else:
                    stack.push(list_elem.value)

            else:

                if (str(self.functions.search(list_elem.value)).isdigit()):

                    digit = stack.get_top()
                    stack.pop()
                    stack.push(self.function(list_elem.value, float(digit)))

                elif str(self.operators.search(list_elem.value)).isdigit():

                    digit_1 = stack.get_top()
                    stack.pop()
                    digit_2 = stack.get_top()
                    stack.pop()

                    stack.push(
                        self.operation(float(digit_1), list_elem.value,
                                       float(digit_2)))

            list_elem = list_elem.prev

        return stack.get_top()
class IteratorDFT:
    def __init__(self, heap_size, heap_list):
        self.current_elem = 0
        self.heap_list = heap_list
        self.end = heap_size - 1
        self.count = 0
        self.stack = Stack()

    def __iter__(self):
        return self

    def has_left_child(self, index):
        if (2 * index) + 1 <= self.end:
            return True
        return False

    def has_right_child(self, index):
        if (2 * index) + 2 <= self.end:
            return True
        return False

    def __next__(self):
        if self.count <= self.end:
            current_elem = self.current_elem

            if self.has_right_child(self.current_elem):
                self.stack.push((2 * self.current_elem) + 2)

            if self.has_left_child(self.current_elem):
                self.current_elem = (2 * self.current_elem) + 1
            else:
                if self.count != self.end:
                    self.current_elem = self.stack.get_top()
                    self.stack.pop()

            self.count += 1

            return self.heap_list[current_elem]
        else:
            raise StopIteration
    def prefix_conversion(self, formula_list):
        """
      Преобразование в префиксную форму записи 
      """
        prefix_str = ''
        stack = Stack()
        list_elem = formula_list.tail

        for _ in range(formula_list.get_size(), 0, -1):

            if list_elem.value == ')':

                stack.push(list_elem.value)

            elif list_elem.value == 'pi' or list_elem.value == 'e' or list_elem.value[
                    0].isdigit(
                    ) or list_elem.value == '-pi' or list_elem.value == '-e' or (
                        list_elem.value[0] == '-'
                        and len(list_elem.value) > 1):

                if prefix_str == '':
                    prefix_str = list_elem.value + prefix_str
                else:
                    prefix_str = list_elem.value + ' ' + prefix_str

            elif list_elem.value == '(':

                while stack.get_top() != ')':

                    if prefix_str == '':
                        prefix_str = stack.get_top() + prefix_str
                    else:
                        prefix_str = stack.get_top() + ' ' + prefix_str

                    stack.pop()

                stack.pop()

            elif str(self.operators.search(list_elem.value)).isdigit() or str(
                    self.functions.search(list_elem.value)).isdigit():

                if stack.stack_list.is_empty():

                    stack.push(list_elem.value)

                elif self.get_priority(list_elem.value) > self.get_priority(
                        stack.get_top()):

                    stack.push(list_elem.value)

                else:

                    while self.get_priority(
                            stack.get_top()) > self.get_priority(
                                list_elem.value):

                        if prefix_str == '':
                            prefix_str = stack.get_top() + prefix_str
                        else:
                            prefix_str = stack.get_top() + ' ' + prefix_str

                        stack.pop()

                        if stack.stack_list.is_empty(): break

                    stack.push(list_elem.value)

            list_elem = list_elem.prev

        while not stack.stack_list.is_empty():

            prefix_str = stack.get_top() + ' ' + prefix_str
            stack.pop()

        return prefix_str