Beispiel #1
0
	def test_desempilha_elemento(self):
		p = Pilha()
		p.empilha(1)
		p.empilha(2)
		p.desempilha()
		self.assertFalse(p.pilhaVazia())
		self.assertEqual(p.tamanho(), 1)
Beispiel #2
0
	def test_empilhar_em_pilha_cheia(self):
		p = Pilha()
		p.empilha(1)
		p.empilha(2)
		p.empilha(3)
		self.assertTrue(p.pilhaCheia())
		self.assertEqual(p.tamanho(), 3)
		p.empilha(4)
		self.assertFalse(p.empilha(4))
Beispiel #3
0
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)
Beispiel #4
0
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