def test_desempilha_elemento(self): p = Pilha() p.empilha(1) p.empilha(2) p.desempilha() self.assertFalse(p.pilhaVazia()) self.assertEqual(p.tamanho(), 1)
def main(): fases = Pilha() fase1 = Fase("Floresta", 300, -100) fase2 = Fase("Castelo", 100, -4) fase3 = Fase("Caverna", 400, -50) fase4 = Fase("Guerra", 3000, -400) fases.empila(fase1) fases.empila(fase2) fases.empila(fase3) fases.empila(fase4) falhou = fases.desempilha() print("Falou na fase:") print(falhou) falhou = fases.desempilha() print("Falou na fase:") print(falhou) print("Voltou para a fase") print(fases.topo)
def main(): fases = Pilha() fase1 = Fase("Floresta", 300, -100) fase2 = Fase("Caverna", 400, -50) fase3 = Fase("Vulcão", 300, -4) fase4 = Fase("Montanha", 3000, -400) fases.empilha(fase1) fases.empilha(fase2) fases.empilha(fase3) fases.empilha(fase4) falhou = fases.desempilha() print("Falhou na fase: ") print(falhou) print("Voltou para a fase:") print(fases.ver_topo) falhou = fases.desempilha() print("Falhou na fase: ") print(falhou) print("Voltou para a fase:") print(fases.ver_topo)
def test_desempilhar_pilha_vazia(self): p = Pilha() self.assertTrue(p.pilhaVazia()) p.desempilha() self.assertFalse(p.desempilha())
class Grafo(object): def __init__(self, id): self.nome = id #self.numVertices = m #self.numArestas = n self.arestas = [] self.vertices = [] self.pilha = Pilha() self.ciclo = False def adicionaVertice(self, vertice): """ Cria uma lista com todos os vertives """ self.vertices.append(vertice) def verticeEstaNaVizinhanca(self, vertice, vizinhos=list): for e in vizinhos: if (str(e.id) == str(vertice.id)): return True return False def adicionaAresta(self, aresta): #aresta.v1.vizinhos.append(aresta.v2) #aresta.v2.vizinhos.append(aresta.v1) #if (self.verticeEstaNaVizinhanca(aresta.v2, aresta.v1.vizinhos) == False): # aresta.v1.vizinhos.append(aresta.v2) #if (self.verticeEstaNaVizinhanca(aresta.v1, aresta.v2.vizinhos) == False): # aresta.v2.vizinhos.append(aresta.v1) self.arestas.append(aresta) def removeAresta(self, aresta): aresta.v1.vizinhos.remove(aresta.v2) aresta.v2.vizinhos.remove(aresta.v1) self.arestas.remove(aresta) def arvoreMinima(self): T = Grafo("MST") # Considerando G um grafo conexo, T tem pelo menos os mesmos vertices de G # Fazendo uma copia deles... for v in self.vertices: vertice = Vertice(v.id) vertice.custoUpgrade = v.custoUpgrade T.adicionaVertice(vertice) self.arestas.sort(key=lambda aresta: aresta.peso) for a in self.arestas: for v in T.vertices: if v.id == a.v1.id: v1 = v for v in T.vertices: if v.id == a.v2.id: v2 = v aresta = Aresta(a.id, v1, v2) aresta.setPeso(a.peso) T.adicionaAresta(aresta) #print ("--Adicionando a aresta", aresta.id) T.possuiCiclo() if T.ciclo: #print ("PossuiCiclo!!!") T.removeAresta(aresta) T.ciclo = False return T def possuiCiclo(self): for v in self.vertices: #print(v.id) #print(v.marcado) self.P(v) for ver in self.vertices: ver.marcado = False def P(self, v): v.marcado = True self.pilha.empilha(v) for w in v.vizinhos: if (w.marcado == False): #print("aresta de arvore!") self.P(w) else: if (self.pilha.existeV(w)) and (self.pilha.saoConsecutivos( v, w) == False): #print("aresta de retorno!") #print("POSSUI CICLO!") self.ciclo = True self.pilha.desempilha() def atualizaVertice(self, v=[]): """ Recebe uma lista de vertices para serem atualizados no grafo """ #reseta as arestas para d0 #for a in self.arestas: # a.peso = a.d0 for vertice in v: for a in self.arestas: if (vertice.id == a.v1.id): #print ("atualiza aresta", a.id) if (a.v2.atualizado): a.peso = a.d2 else: a.peso = a.d1 if (vertice.id == a.v2.id): #print ("atualiza aresta", a.id) if (a.v1.atualizado): a.peso = a.d2 else: a.peso = a.d1 vertice.atualizado = True for vertice in v: vertice.atualizado = False
def analisa(self): p = Pilha() p.empilha("$") p.empilha("<start>") tabela = GeraTabelaSintatica() tabela.gerar_tabela() # Abre o arquivo de saida do programa arquivo_saida = open(self.arquivo_saida, 'w') # Verifica se o arquivo de entrada existe no diretorio em questao if not os.path.exists(self.arquivo_entrada): arquivo_saida.write("Arquivo de entrada inexistente") return # Abre o arquivo de entrada do programa arquivo = open(self.arquivo_entrada, 'r') # Le o primeiro token linha_list_tok = arquivo.readline() # Variavel que indica o token_atual token_linha = linha_list_tok.split(' ') token_atual = token_linha[1] # Percorre o programa linha por linha while linha_list_tok: if (token_linha[0] == "tok500"): token_atual = token_linha[0] #print(token_atual) elif (token_linha[0] == "tok300"): token_atual = token_linha[0] #print(token_atual) elif (token_linha[0] == "tok400"): token_atual = token_linha[0] #print(token_atual) elif (token_linha[0] == "tok700"): token_atual = token_linha[0] #print(token_atual) else: token_atual = token_linha[1].replace("\n", "") #print(token_atual) prod_topo_pilha = p.desempilha() while (token_atual != prod_topo_pilha): producoes = tabela.consultar_tabela_sintatica( prod_topo_pilha, token_atual) print(producoes) if (producoes[0] != "$"): for prod in range(len(producoes)): p.empilha(producoes[prod]) elif producoes[0] == "x": print("Erro sintatico") break prod_topo_pilha = p.desempilha() linha_list_tok = arquivo.readline() # Le proximo token token_linha = linha_list_tok.split(' ') if (len(token_linha) == 2): token_atual = token_linha[1] # Fim do arquivo de entrada arquivo.close() # Fim do arquivo de entrada arquivo_saida.close