Exemple #1
0
 def __balanced_parenthesis(self, expression: str) -> bool:
     stack = Stack()
     error = False
     for i in expression:
         if i == "(":
             stack.push(i)
         elif i == ")":
             if stack.is_empty():
                 error = True
                 break
             stack.pop()
     if error or not stack.is_empty():
         return False
     return True
Exemple #2
0
    def __reverse_expression(self, expression: str) -> str:
        expression = self.__split(expression, " ")
        stack = Stack()
        for i in expression:
            stack.push(i)

        expression = ""
        while not stack.is_empty():
            expression += stack.pop() + " "

        return expression[:len(expression) - 1]
Exemple #3
0
    def arithmetic_expression_evaluation(self) -> float:
        """
        Evaluación de la expresión aritmética en notación Postfix,
        utilizando una Stack, calculando el resultado final de la expresión.
        """
        result = None

        expression_postfix = self.postfix()
        if not expression_postfix:
            return

        postfix_list = self.__split(expression_postfix, " ")
        operands_stack = Stack()

        for i in postfix_list:
            if self.__isdigit(i):
                operands_stack.push(i)
            elif i in "+-*/^":
                num2 = operands_stack.pop()
                num1 = operands_stack.pop()
                result = self.__operate(num1, num2, i)
                operands_stack.push(str(result))
        return result
Exemple #4
0
    def postfix(self) -> str:
        """
        Método que convierte una expresión Infix a una expresión Postfix,
        haciendo uso de una Stack. Separar operandos y operadores por un
        espacio en blanco.
        """
        priorities = {"+": 1, "-": 1, "*": 2, "/": 2, "^": 3, "(": 0}
        operators_stack = Stack()

        expression_infix = self.infix()
        if not expression_infix:
            return

        infix_list = self.__split(expression_infix, " ")
        postfix_list = SinglyLinkedList()

        for i in infix_list:
            if self.__isdigit(i):
                postfix_list.append(i)
            elif i == ")":
                top = operators_stack.pop()
                while top != "(" and not operators_stack.is_empty():
                    postfix_list.append(top)
                    top = operators_stack.pop()
            elif i == "(":
                operators_stack.push(i)
            elif i in priorities:
                if operators_stack.is_empty():
                    operators_stack.push(i)
                else:
                    top = operators_stack.peek()
                    if priorities[i] > priorities[top] or i == top == "^":
                        operators_stack.push(i)
                    else:
                        while not operators_stack.is_empty():
                            top = operators_stack.peek()
                            if priorities[top] >= priorities[i]:
                                postfix_list.append(operators_stack.pop())
                            else:
                                break
                        operators_stack.push(i)

        while not operators_stack.is_empty():
            postfix_list.append(operators_stack.pop())

        expression_postfix = ""
        for i in postfix_list:
            expression_postfix += str(i) + " "

        return expression_postfix[:len(expression_postfix) - 1]