Beispiel #1
0
class ListaSimples:
    
    def __init__(self):
        self.cabeca = No(None)

    def esta_vazia(self):
        return self.cabeca.get_proximo() == None
    
    def adicionar(self, novo_no):
        if(self.esta_vazia()):
            self.cabeca.set_proximo(novo_no)
        else:
            atual = self.cabeca

            while(atual.get_proximo()):
                atual = atual.get_proximo()
            
            atual.set_proximo(novo_no)

    def percorrer(self):
        atual = self.cabeca.get_proximo()

        while(atual):
            print(atual.get_elemento())
            atual = atual.get_proximo()
Beispiel #2
0
def bfs(estado_inicial,
        testar_objetivo,
        gerar_sucessores,
        imprimir=str,
        stepEstado=False,
        stepSucessores=False):
    fila = Fila()
    fila.push(No(estado_inicial))
    visitados = {estado_inicial}  # Conjuntos (Sets) em python e {1, 2, 3}

    while not fila.esta_vazio():
        no_atual = fila.pop()
        estado_atual = no_atual.estado

        if stepEstado: imprime_atual(estado_atual, imprimir)

        # faz o teste objetivo conforme a função `teste_objetivo`
        # para a execução se achou o objetivo
        if (testar_objetivo(estado_atual)):
            return no_atual

        # verifico os nos filhos e os adiciono na fila
        # função sucessores define os estados seguintes e adiciona os nós seguintes
        estados_vertices_sucessores = gerar_sucessores(estado_atual)
        if stepSucessores:
            imprime_sucessores(estados_vertices_sucessores, imprimir)

        for estados_vertices_sucessor in estados_vertices_sucessores:
            estado_filho = estados_vertices_sucessor[0]
            vertice = estados_vertices_sucessor[1]
            if estado_filho in visitados:  # pula estado_filho se já foi expandido
                continue
            visitados.add(estado_filho)
            fila.push(No(estado_filho, no_atual, vertice))
    def inserir(self, index, Novoelemento):
        # cria o nó com o novo elemento
        no = No(Novoelemento)

        #Se quiser inserir na primeira posição da lista
        if index == 0:
            # O item de inicio da lista (não atualizada) se torna o no.proximo
            no.proximo = self.inicio
            #Atualiza o inicio da lista para o nó que entrou
            self.inicio = no
        #se quiser inserir numa posição diferente de 0
        else:
            #ponteiro começa na primeira posição
            #ponteiro = self.inicio
            #O -1 é para que possamos inserir após seu precessor, no local correto da lista
            #for item in range(index - 1):
            #se o ponteiro não está numa posição vazia(none), último da lista
            #if ponteiro:
            #O ponteiro "anda" para o próximo da lista
            #ponteiro = ponteiro.proximo
            #else:
            #raise IndexError("Index fora do intervalo da Lista")

            #A parte acima do código virou a função a parte getNo()
            #O -1 garante que o item a ser incerido fique na posição correta
            ponteiro = self.getNo(index - 1)
            #garante que os próximos valores serão "apontados"
            no.proximo = ponteiro.proximo
            ponteiro.next = no

        #aumenta o tamanho da lista em 1
        self.tamanho += 1
Beispiel #4
0
 def add(self, item):
     aux = No(item)
     if self._topo is None:
         self._topo = aux
         return True
     aux.set_proximo(self._topo)
     self._topo = aux
     return True
Beispiel #5
0
 def adicionar(self, valor):
     if self.inicio:
         ponteiro = self.inicio
         while(ponteiro.proximo):
             ponteiro = ponteiro.proximo
         ponteiro.proximo = No(valor)
     else:
         self.inicio = No(valor)
     self.tamanho = self.tamanho +1
Beispiel #6
0
    def add(self, nome, matricula, curso):
        p = No(nome, matricula, curso)

        if self.__topo == None:
            self.__topo = p

        else:
            p.set_proximo(self.__topo)
            self.__topo = p
Beispiel #7
0
 def add_inicio(self, item):
     aux = No(item)
     if self._cabeca is None:
         self._cabeca = self._cauda = aux
         self.count()
         return True
     aux.set_proximo(self._cabeca)
     self._cabeca = aux
     self.count()
     return True
 def load_graph(self, path):
     graph = open(path, "r")
     text = ""
     for line in graph:
         formated_input = self.__format_string(line)
         no = No(formated_input[0])
         no.neighbors = formated_input[1]
         text += GRAU.format(formated_input[0], len(formated_input[1]))
         self.graph.append(no)
         self.label2.configure(text=text)
Beispiel #9
0
    def adicionar(self, dado):
        no = No(dado)

        if self.tamanho == 0:
            self.fim = no
        else:
            no.anterior = self.fim
            self.fim = no

        self.tamanho += 1
Beispiel #10
0
 def inserir(self, index, Novoelemento):
     no = No(Novoelemento)
     if index == 0:
         no.proximo = self.inicio
         self.inicio = no
     else:
         ponteiro = self.getNo(index-1)
         no.proximo = ponteiro.proximo
         ponteiro.next = no
     self.tamanho += 1
Beispiel #11
0
 def add_meio(self, item, pos):
     aux = No(item)
     p = q = self._cabeca
     for i in range(pos):
         p = p.get_proximo()
         q = p.get_proximo()
     aux.set_proximo(q)
     p.set_proximo(aux)
     self.count()
     return True
Beispiel #12
0
    def push(self, elemento):
        """
        insere elementos na pilha

        :param elemento: elemento a ser inserido
        """
        no = No(elemento)
        no.next = self.topo #registra a posição do elemento anterior
        self.topo = no
        self._size = self._size + 1
Beispiel #13
0
 def insert(self, index, elem):
     last = self.head
     no = No(elem)
     pos = index - 1
     pos = int(pos)
     if pos == 0:
         no.set_proximo(self.head)
         self.head = no
         print(f'Elemento adicionado na primeira posição: {self.head}')
         self.size += 1
     elif pos > self.size:
         print(f'A posição {index}, não existe.')
         answer = input('Deseja adicionar no final da lista? [S/N] ')
         if answer == 'S':
             while last.get_proximo():
                 last = last.get_proximo()
             last.next = No(elem)
             self.size += 1
             print(f'Elemento: {elem} adicionado ao final da lista.')
         else:
             print('OKAY')
     else:
         pointer = self._getnode(pos - 1)
         no = No(elem)
         aux = pointer.get_proximo()
         no.set_proximo(aux)
         pointer.set_proximo(no)
         print(f'Elemento: {elem} adicionado na posição {pos + 1}')
         self.size += 1
    def addFirst(self, dado):
        no = No(dado)

        if self.head == None:
            self.tail = no
        else:
            no.proximo = self.head
            self.head.anterior = no

        self.head = no
        no.indice += 1
Beispiel #15
0
 def type(self):
     type = No()
     if self.conferirToken([Tag.KW_NUM]):
         type.tipo = Tag.TIPO_NUMERO
         self.advance()
     elif self.conferirToken([Tag.KW_CHAR]):
         type.tipo = Tag.TIPO_LITERAL
         self.advance()
     else:
         self.sinalizaErroSintatico("Aguardando 'num' ou 'char'")
     return type
Beispiel #16
0
 def factorB(self):
     factorB = No()
     factorA = self.factorA()
     factorBLinha = self.factorBLinha()
     if factorBLinha.tipo == Tag.TIPO_VAZIO:
         factorB.tipo = factorA.tipo
     elif factorBLinha.tipo == factorA.tipo and factorBLinha.tipo == Tag.TIPO_NUMERO:
         factorB.tipo = Tag.TIPO_NUMERO
     else:
         factorB.tipo = Tag.TIPO_ERRO
     return factorB
Beispiel #17
0
 def constant(self):
     constant = No()
     if self.conferirToken([Tag.NUM_CONST]):
         constant.tipo = Tag.TIPO_NUMERO
         self.advance()
     elif self.conferirToken([Tag.CHAR_CONST]):
         constant.tipo = Tag.TIPO_LITERAL
         self.advance()
     else:
         self.sinalizaErroSintatico("Constante esperada'")
     return constant
Beispiel #18
0
 def simpleExpr(self):
     simpExp = No()
     term = self.term()
     simExpLinha = self.simpleExprLinha()
     if simExpLinha.tipo == Tag.TIPO_VAZIO:
         simpExp.tipo = term.tipo
     elif simExpLinha.tipo == term.tipo and simExpLinha.tipo == Tag.TIPO_NUMERO:
         simpExp.tipo = Tag.TIPO_LOGICO
     else:
         simpExp.tipo = Tag.TIPO_ERRO
     return simpExp
Beispiel #19
0
 def term(self):
     term = No()
     factoB = self.factorB()
     termLinha = self.termLinha()
     if termLinha.tipo == Tag.TIPO_VAZIO:
         term.tipo = factoB.tipo
     elif termLinha.tipo == factoB.tipo and termLinha.tipo == Tag.TIPO_NUMERO:
         term.tipo = Tag.TIPO_NUMERO
     else:
         term.tipo = Tag.TIPO_ERRO
     return term
Beispiel #20
0
 def expression(self):
     noExp = No()
     noSimpleExp = self.simpleExpr()
     noExpLinha = self.expressionLinha()
     if noExpLinha.tipo == Tag.TIPO_VAZIO:
         noExp.tipo = noSimpleExp.tipo
     elif noExpLinha.tipo == noSimpleExp.tipo and noSimpleExp.tipo == Tag.TIPO_LOGICO:
         noExp.tipo = Tag.TIPO_LOGICO
     else:
         noExp.tipo = Tag.TIPO_ERRO
     return noExp
Beispiel #21
0
 def _inserir(self, chave, val, noCorrente):
     # valor chave do nó é menor doque o atual nó
     if chave < noCorrente.chave:
         if noCorrente.temFilhoEsquerda():
             self._inserir(chave, val, noCorrente.esquerda)
         else:
             noCorrente.esquerda = No(chave, val, pai = noCorrente)
     else:
         if noCorrente.temFilhoDireita():
             self._inserir(chave, val, noCorrente.direita)
         else:
             noCorrente.direita = No(chave, val, pai = noCorrente)
def expansao(n):
    expand = []
    ## Antes de retornar, setta o pai dos nos expandidos como o no que chegou
    for x in mapa:
        x = No(x)
        if x != n.estado:
            x.pai = n
            x.caminho2 = n.caminho2 + [n.estado]
            expand.append(x)

    random.shuffle(expand)
    return expand
 def adicionar(self, valor):
     no = No(valor)
     if self.inicio:
         ponteiro = self.inicio
         while (ponteiro.proximo):
             ponteiro = ponteiro.proximo
         ponteiro.proximo = no
         no.anterior = ponteiro
         self.fim = no
     else:
         self.inicio = no
         self.fim = no
     self.tamanho += 1
Beispiel #24
0
 def factorBLinha(self):
     factorBlinha = No()
     if self.conferirToken([Tag.OP_DIV, Tag.OP_MUL]):
         self.mulop()
         factorA = self.factorA()
         factorBlinhaFilho = self.factorBLinha()
         if factorBlinhaFilho.tipo == Tag.TIPO_VAZIO and factorA.tipo == Tag.TIPO_NUMERO:
             factorBlinha.tipo = Tag.TIPO_NUMERO
         elif factorBlinhaFilho.tipo == factorA.tipo and factorA.tipo == Tag.TIPO_NUMERO:
             factorBlinha.tipo = Tag.TIPO_NUMERO
         else:
             factorBlinha.tipo = Tag.TIPO_ERRO
     return factorBlinha
Beispiel #25
0
 def expressionLinha(self):
     expLinha = No()
     if self.conferirToken([Tag.KW_OR, Tag.KW_AND]):
         self.logop()
         simpleExpres = self.simpleExpr()
         exprLinhaFilho = self.expressionLinha()
         if exprLinhaFilho.tipo == Tag.TIPO_VAZIO and simpleExpres.tipo == Tag.TIPO_LOGICO:
             expLinha.tipo = Tag.TIPO_LOGICO
         elif exprLinhaFilho.tipo == simpleExpres.tipo and simpleExpres.tipo == Tag.TIPO_LOGICO:
             expLinha.tipo = Tag.TIPO_LOGICO
         else:
             expLinha.tipo = Tag.TIPO_ERRO
     return expLinha
Beispiel #26
0
 def termLinha(self):
     termLinha = No()
     if self.conferirToken([Tag.OP_AD, Tag.OP_MIN]):
         self.addOp()
         factorB = self.factorB()
         termLinhaFilho = self.termLinha()
         if termLinhaFilho.tipo == Tag.TIPO_VAZIO and factorB.tipo == Tag.TIPO_NUMERO:
             termLinha.tipo = Tag.TIPO_NUMERO
         elif termLinhaFilho == factorB.tipo and factorB.tipo == Tag.TIPO_NUMERO:
             termLinha.tipo = Tag.TIPO_NUMERO
         else:
             termLinha.tipo = Tag.TIPO_ERRO
     return termLinha
Beispiel #27
0
 def append(self, elem):
     if self.head:
         # INSERÇÃO COM A LISTA POSSUINDO ELEMENTOS
         pointer = self.head
         while pointer.get_proximo():
             pointer = pointer.get_proximo()
         pointer.next = No(elem)
         print(f'Elemento: {elem} adicionado ao final da lista.')
     else:
         # INSERÇÃO NO TOPO - LISTA VAZIA
         self.head = No(elem)
         print(f'Primeiro elemento da lista: {elem}')
     self.size += 1
 def adicionar(self, valor):
     #se a lista não estiver vazia
     if self.inicio:
         #inserção quando a lista já possui elementos
         ponteiro = self.inicio
         while (ponteiro.proximo):
             ponteiro = ponteiro.proximo
         ponteiro.proximo = No(valor)
     else:
         #self.inicio terá apenas uma referência para o objeto
         self.inicio = No(valor)
     #incrementa em um o tamanho da lista
     self.tamanho = self.tamanho + 1
Beispiel #29
0
    def factorA(self):
        factorA = No()
        if self.conferirToken([Tag.KW_NOT]):
            self.advance()
            factor = self.factor()
            if factor.tipo != Tag.TIPO_LOGICO:
                factorA.tipo = Tag.TIPO_ERRO
            else:
                factorA.tipo = Tag.TIPO_LOGICO
        else:
            factor = self.factor()
            factorA.tipo = factor.tipo

        return factorA
Beispiel #30
0
 def factor(self):
     factor = No()
     if self.conferirToken([Tag.ID]):
         factor.tipo = self.lexer.ts.getType(self.token.lexema)
         self.advance()
     elif self.conferirToken([Tag.SMB_OPA]):
         self.eat(Tag.SMB_OPA)
         factor = self.expression()
         self.eat(Tag.SMB_CPA)
     elif self.conferirToken([Tag.NUM_CONST, Tag.CHAR_CONST]):
         factor = self.constant()
     else:
         self.sinalizaErroSintatico("Fator inválido")
     return factor