예제 #1
0
def esta_balanceada(expressao):
    """
    Função que calcula se expressão possui parenteses, colchetes e chaves balanceados
    O Aluno deverá informar a complexidade de tempo e espaço da função
    Deverá ser usada como estrutura de dados apenas a pilha feita na aula anterior
    :param expressao: string com expressao a ser balanceada
    :return: boleano verdadeiro se expressao está balanceada e falso caso contrário
    TEMPO DE EXECUCAO:
        O(n)
    ESPACO DE MEMORIA:
        O(n)
    """

    validos = [
        ['(', ')'],
        ['[', ']'],
        ['{', '}']
    ]

    pilha = Pilha()

    if len(expressao) == 0:
        return True

    if len(expressao) == 1:
        return False

    for c in expressao:
        for i in validos:
            if c in i:
                if c == i[0]:
                    pilha.empilhar(c)
                elif pilha.vazia() or i[0] != pilha.desempilhar():
                    return False

    return pilha.vazia()
def avaliar(expressao):
    """
    Função que avalia expressão aritmetica retornando se valor se não houver nenhum erro
    :param expressao: string com expressão aritmética
    :return: valor númerico com resultado

    tempo: O(n)
    Memoria: O(n)
    """

    if expressao:

        fila = analise_sintatica(analise_lexica(expressao))

        teste = fila.__len__()
        if teste == 1:
            return fila.primeiro()
        else:
            pilha = Pilha()

            for i in range(fila.__len__()):

                pilha.empilhar(fila._deque[i])

                if pilha.__len__() >= 3 and str(pilha.topo()) not in '-+*/(){}[]':

                    valor = pilha.topo()
                    pilha.desempilhar()

                    if pilha.topo() == '+':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() + valor
                        pilha.empilhar(valor)
                        valor = ''
                    elif pilha.topo() == '-':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() - valor
                        pilha.empilhar(valor)
                        valor = ''
                    elif pilha.topo() == '*':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() * valor
                        pilha.empilhar(valor)
                        valor = ''
                    elif pilha.topo() == '/':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() / valor
                        pilha.empilhar(valor)
                        valor = ''
                    else:
                        pilha.empilhar(valor)

                elif str(pilha.topo()) in ')}]' and i == fila.__len__() - 1:
                    pilha.desempilhar()


                    while len(pilha) > 1:

                        if str(pilha.topo()) not in '-+*/(){}[]':
                            valor = pilha.topo()
                            pilha.desempilhar()

                            if pilha.topo() == '+':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() + valor
                                pilha.empilhar(valor)
                                valor = ''
                            elif pilha.topo() == '-':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() - valor
                                pilha.empilhar(valor)
                                valor = ''
                            elif pilha.topo() == '*':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() * valor
                                pilha.empilhar(valor)
                                valor = ''
                            elif pilha.topo() == '/':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() / valor
                                pilha.empilhar(valor)
                                valor = ''
                            elif str(pilha.topo()) in '(){}[]':
                                pilha.desempilhar()
                                pilha.empilhar(valor)
                            else:
                                pilha.empilhar(valor)
                        else:
                            pilha.desempilhar()


            return pilha.topo()

    raise ErroSintatico()