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
示例#3
0
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()
示例#4
0
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
示例#6
0
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
示例#8
0
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()
示例#10
0
文件: exercicio.py 项目: walelite/ES
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()
示例#12
0
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()
示例#13
0
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()
示例#15
0
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