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()