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 """ #Análise de Complexidade #Tempo e memória são O(n) pilha = Pilha() if expressao == "": return True elif expressao[0] in ')}]': return False else: for caracter in expressao: if caracter in '({[': pilha.empilhar(caracter) else: try: desenpilhado = pilha.desempilhar() except PilhaVaziaErro: return pilha.vazia() if caracter == '}' and desenpilhado != '{': return False elif caracter == ']' and desenpilhado != '[': return False elif caracter == ')' and desenpilhado != '(': return False return pilha.vazia()
def esta_balanceada(expressao): pilha = Pilha() abrir = "{[(" fechar = "}])" if expressao and expressao[0] in fechar: return False for x in expressao: if x in abrir: pilha.empilhar(x) # print (x) elif x in fechar: if ( x == "}" and pilha.desempilhar() != "{" or x == ")" and pilha.desempilhar() != "(" or x == "]" and pilha.desempilhar() != "[" ): return False if pilha.vazia(): return True
def avaliar(expressao): if expressao: fila=analise_sintatica(analise_lexica(expressao)) if fila.__len__()==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() #verificação de sinais 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() #verificação de sinais 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()
def analise_lexica(expressao): def caracteres(param1): return param1 in "(){.}[]+-*/" fila=Fila() count=0 pilha=Pilha() while count!=len(expressao): if not(caracteres(expressao[count]) or num(expressao[count])): raise ErroLexico else: if caracteres(expressao[count]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[count]) if num(expressao[count]): if pilha.vazia(): pilha.empilhar(expressao[count]) else: final=pilha.desempilhar() pilha.empilhar(final+expressao[count]) count+=1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
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 """ expressao=analise_sintatica(analise_lexica(expressao)) lista3=Pilha() for i in expressao: if i in set("012345679") and i in set("/*-+") and i in set("(){}[]"): lista3.empilhar(i) for j in lista3: for j in set("1234567890"): num=j num2=[j+1] if j =="+": soma=num+num2 lista3.empilhar(soma) if j =="-": sub=num-num2 lista3.empilhar(sub) if j =="*": mu=num+num2 lista3.empilhar(mu) if j =="+": di=num+num2 lista3.empilhar(di) if j in set("(){}[]"): lista3.desempilhar(j) return lista3
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 Complexidade*: tempo: O(n) Memoria: O(n) """ if expressao: fila = analise_sintatica(analise_lexica(expressao)) # print(fila._deque) if fila.__len__() == 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() # print(pilha._lista) 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() # print('Nova pilha: ',pilha._lista, 'Tamanho: ', len(pilha)) return pilha.topo() raise ErroSintatico()
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 """ expressao = analise_sintatica(analise_lexica(expressao)) lista3 = Pilha() for i in expressao: if i in set("012345679") and i in set("/*-+") and i in set("(){}[]"): lista3.empilhar(i) for j in lista3: for j in set("1234567890"): num = j num2 = [j + 1] if j == "+": soma = num + num2 lista3.empilhar(soma) if j == "-": sub = num - num2 lista3.empilhar(sub) if j == "*": mu = num + num2 lista3.empilhar(mu) if j == "+": di = num + num2 lista3.empilhar(di) if j in set("(){}[]"): lista3.desempilhar(j) return lista3
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 """ fila = analise_sintatica(analise_lexica(expressao)) pilha = Pilha() a, b, c = None, None, None d = 0 for k in fila: pilha.empilhar(k) if len(pilha) >= 3: a = pilha.desempilhar() b = pilha.desempilhar() c = pilha.desempilhar() if str(b) in "-+*/" and str(c) not in "([{" and str(a) not in "([{": if b == "+": d = c + a elif b == "-": d = c - a elif b == "*": d = c * a elif b == "/": d = c / a pilha.empilhar(d) else: pilha.empilhar(c) pilha.empilhar(b) pilha.empilhar(a) if str(k) in ")]}": pilha.desempilhar() d = pilha.desempilhar() pilha.desempilhar() pilha.empilhar(d) if len(pilha) >= 3: a = pilha.desempilhar() b = pilha.desempilhar() c = pilha.desempilhar() if str(b) in "-+*/" and str(c) not in "([{" and str(a) not in ")]}": if b == "+": d = c + a elif b == "-": d = c - a elif b == "*": d = c * a elif b == "/": d = c / a pilha.empilhar(d) else: pilha.empilhar(c) pilha.empilhar(b) pilha.empilhar(a) return pilha.desempilhar()
def avaliar(expressao): avalia = analise_sintatica(analise_lexica(expressao)) resposta = Pilha () a, b, c = None, None, None aux = 0 for elemento in avalia: resposta.empilhar(elemento) if len(resposta) >= 3: a = resposta.desempilhar() b = resposta.desempilhar() c = resposta.desempilhar() if str(a) not in '{[()]}' and str(c) not in '{[()]}' and str(b) in '+-*/' : if b == '+': aux = c + a elif b == '-': aux = c - a elif b == '*': aux = c * a elif b == '/': aux = c / a resposta.empilhar (aux) else: resposta.empilhar(c) resposta.empilhar(b) resposta.empilhar(a) if str (elemento) in ')]}': resposta.desempilhar() aux = resposta.desempilhar() resposta.desempilhar() resposta.empilhar(aux) if len(resposta) >= 3: a = resposta.desempilhar() b = resposta.desempilhar() c = resposta.desempilhar() if str(a) not in '{[()]}' and str(c) not in '{[()]}' and str(b) in '+-*/' : if b == '+': aux = c + a elif b == '-': aux = c - a elif b == '*': aux = c * a elif b == '/': aux = c / a resposta.empilhar (aux) else: resposta.empilhar(c) resposta.empilhar(b) resposta.empilhar(a) return resposta.desempilhar()
def avaliar(expressao): fila=analise_sintatica(analise_lexica(expressao)) res=Pilha() var3,var2,var1 = None,None,None aux=0 for t in fila: res.empilhar(t) if len(res)>=3: var3=res.desempilhar() var2=res.desempilhar() var1=res.desempilhar() if str(var2) in "+-*/" and not str(var1) in "([{" and not str(var3) in "([{" : if var2 == "+": aux=var1+var3 elif var2 == "/": aux=var1/var3 elif var2 == "-": aux=var1-var3 elif var2 == "*": aux=var1*var3 res.empilhar(aux) else: res.empilhar(var1) res.empilhar(var2) res.empilhar(var3) if str(t) in ")}]": res.desempilhar() aux=res.desempilhar() res.desempilhar() res.empilhar(aux) if len(res)>=3: var3=res.desempilhar() var2=res.desempilhar() var1=res.desempilhar() if str(var2) in "+-*/" and not str(var1) in "([{" and not str(var3) in "([{" : if var2 == "+": aux=var1+var3 elif var2 == "/": aux=var1/var3 elif var2 == "-": aux=var1-var3 elif var2 == "*": aux=var1*var3 res.empilhar(aux) else: res.empilhar(var1) res.empilhar(var2) res.empilhar(var3) return res.desempilhar() """ 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 """ pass
def avaliar(expressao): pilha = Pilha() analise = analise_sintatica(analise_lexica(expressao)) especiais = '{[()]}' matematicos = '+-*/' for atual in analise: pilha.empilhar(atual) if len(pilha) >= 3: p1, p2, p3 = pilha.desempilhar(), pilha.desempilhar(), pilha.desempilhar() if str(p1) not in especiais and str(p3) not in especiais and str(p2) in matematicos: if p2 == '+': controle = p3 + p1 elif p2 == '-': controle = p3 - p1 elif p2 == '*': controle = p3 * p1 else: controle = p3 / p1 pilha.empilhar(controle) else: pilha.empilhar(p3) pilha.empilhar(p2) pilha.empilhar(p1) if str(atual) in ')]}': pilha.desempilhar() controle = pilha.desempilhar() pilha.desempilhar() pilha.empilhar(controle) if len(pilha) >= 3: p1, p2, p3 = pilha.desempilhar(), pilha.desempilhar(), pilha.desempilhar() if str(p1) not in especiais and str(p3) not in especiais and str(p2) in matematicos: if p2 == '+': controle = p3 + p1 elif p2 == '-': controle = p3 - p1 elif p2 == '*': controle = p3 * p1 else: controle = p3 / p1 pilha.empilhar(controle) else: pilha.empilhar(p3) pilha.empilhar(p2) pilha.empilhar(p1) return pilha.desempilhar()
def avaliar(expressao): token2 = R".-+*/{}[]()" token3 = R"(){}[]" num3 = '+' if expressao: fila = analise_sintatica(analise_lexica(expressao)) if fila.__len__() == 1: return fila.primeiro() else: pilha = Pilha() for lex in range(fila.__len__()): pilha.empilhar(fila._deque[lex]) if pilha.__len__() >= 3 and str(pilha.topo()) not in token2: num = pilha.topo() pilha.desempilhar() if pilha.topo() == num3: pilha.desempilhar() num = pilha.desempilhar() + num pilha.empilhar(num) elif pilha.topo() == '-': pilha.desempilhar() num = pilha.desempilhar() - num pilha.empilhar(num) elif pilha.topo() == '*': pilha.desempilhar() num = pilha.desempilhar() * num pilha.empilhar(num) elif pilha.topo() == '/': pilha.desempilhar() num = pilha.desempilhar() / num pilha.empilhar(num) else: pilha.empilhar(num) elif str(pilha.topo()) in ')}]' and lex == fila.__len__() - 1: pilha.desempilhar() while len(pilha) > 1: if str(pilha.topo()) not in token2: num = pilha.topo() pilha.desempilhar() if pilha.topo() == num3: pilha.desempilhar() num = pilha.desempilhar() + num pilha.empilhar(num) elif pilha.topo() == '/': pilha.desempilhar() num = pilha.desempilhar() / num pilha.empilhar(num) elif pilha.topo() == '*': pilha.desempilhar() num = pilha.desempilhar() * num pilha.empilhar(num) elif pilha.topo() == '-': pilha.desempilhar() num = pilha.desempilhar() - num pilha.empilhar(num) elif str(pilha.topo()) in token3: pilha.desempilhar() pilha.empilhar(num) else: pilha.empilhar(num) else: pilha.desempilhar() return pilha.topo() raise ErroSintatico()
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 """ fila = analise_sintatica(analise_lexica(expressao)) pilha = Pilha() v1,v2,v3=None,None,None r=0 for c in fila: pilha.empilhar(c) if len(pilha)>=3: v3 = pilha.desempilhar() v2 = pilha.desempilhar() v1 = pilha.desempilhar() if str(v3) not in '({[)}]' and str(v1) not in '(){}[]' and str(v2) in '+-/*': if str(v2) == '+': r = v1 + v3 elif str(v2) == '-': r = v1 - v3 elif str(v2) == '/': r = v1/v3 elif str(v2) == "*": r = v1*v3 pilha.empilhar(r) else: pilha.empilhar(v1) pilha.empilhar(v2) pilha.empilhar(v3) if str(c) in ')}]': pilha.desempilhar() r=pilha.desempilhar() pilha.desempilhar() pilha.empilhar(r) if len(pilha)>=3: v3 = pilha.desempilhar() v2 = pilha.desempilhar() v1 = pilha.desempilhar() if str(v3) not in '({[)}]' and str(v1) not in '(){}[]' and str(v2) in '+-/*': if str(v2) == '+': r = v1 + v3 elif str(v2) == '-': r = v1 - v3 elif str(v2) == '/': r = v1/v3 elif str(v2) == "*": r = v1*v3 pilha.empilhar(r) else: pilha.empilhar(v1) pilha.empilhar(v2) pilha.empilhar(v3) return pilha.topo()
def avaliar(expressao): """ Avalia a expressao e ve se está correta. Tempo de execução O(n) Espaço de memoria O(n) :param expressao: recebe a expressao a ser analisada :return: erro na expressao """ if expressao: fila = analise_sintatica(analise_lexica(expressao)) tamanho = len(fila) if tamanho == 1: return fila.primeiro() else: pilha = Pilha() for n in range(tamanho): pilha.empilhar(fila._deque[n]) 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) elif pilha.topo() == '-': pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) elif pilha.topo() == '*': pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) elif pilha.topo() == '/': pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) else: pilha.empilhar(valor) elif str(pilha.topo()) in ')}]' and n == tamanho - 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) elif pilha.topo() == '-': pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) elif pilha.topo() == '*': pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) elif pilha.topo() == '/': pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) elif str(pilha.topo()) in '(){}[]': pilha.desempilhar() pilha.empilhar(valor) else: pilha.empilhar(valor) else: pilha.desempilhar() return pilha.topo() raise ErroSintatico()
def avaliar(expressao): fila=analise_sintatica(analise_lexica(expressao)) res=Pilha() var3,var2,var1 = None,None,None aux=0 for t in fila: res.empilhar(t) if len(res)>=3: var3=res.desempilhar() var2=res.desempilhar() var1=res.desempilhar() if str(var2) in "+-*/" and not str(var1) in "([{}])" and not str(var3) in "([{}])" : if var2 =="+": aux=var1+var3 elif var2 =="/": aux=var1/var3 elif var2 =="-": aux=var1-var3 elif var2 =="*": aux=var1*var3 res.empilhar(aux) else: res.empilhar(var1) res.empilhar(var2) res.empilhar(var3) if str(t) in ")}]": res.desempilhar() aux=res.desempilhar() res.desempilhar() res.empilhar(aux) if len(res)>=3: var3=res.desempilhar() var2=res.desempilhar() var1=res.desempilhar() if str(var2) in "+-*/" and not str(var1) in "([{}])" and not str(var3) in "([{}])" : if var2 =="+": aux=var1+var3 elif var2 =="/": aux=var1/var3 elif var2 =="-": aux=var1-var3 elif var2 =="*": aux=var1*var3 res.empilhar(aux) else: res.empilhar(var1) res.empilhar(var2) res.empilhar(var3) return res.desempilhar() """ 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 O(n) para tempo, pois vai percorer toda a expressao O(n) para memoria pois a pilha cresce conforme a expressao aumenta, mesmo que tenha variaveis auxiliares constantes, ainda crescera com o tamanho da expressao """ pass