├── README.md ├── arrays.py ├── filas.py ├── pilhas.py ├── hash-map.py ├── arvores.py ├── lista-simplesmente-encadeada-head.py ├── lista-simplesmente-encadeada-head-tail.py └── lista-duplamente-encadeada.py /README.md: -------------------------------------------------------------------------------- 1 | # 7 Days of Code - Estruturas de Dados 2 | 3 | ## Tópicos abordados 4 | - Arrays; 5 | - Listas simplesmente encadeadas; 6 | - Listas duplamente encadeadas; 7 | - Filas; 8 | - Pilhas; 9 | - Hash Maps; 10 | - Árvores. 11 | -------------------------------------------------------------------------------- /arrays.py: -------------------------------------------------------------------------------- 1 | # Definindo a classe ListaDeCompras para representar a lista de compras 2 | class ListaDeCompras: 3 | def __init__(self): 4 | self.items = [] 5 | self.quantidades = [] 6 | 7 | # Adicionando um novo item à lista de compras 8 | def adicionar_item(self, item, quantidade): 9 | self.items.append(item) 10 | self.quantidades.append(quantidade) 11 | 12 | # Removendo um item da lista de compras 13 | def remover_item(self, item): 14 | indexDoItem = self.items.index(item) 15 | self.items.pop(indexDoItem) 16 | self.quantidades.pop(indexDoItem) 17 | 18 | # Listando todos os itens da lista de compras 19 | def listar_itens(self): 20 | print("Lista de compras") 21 | for i in range(len(self.items)): 22 | print(f"{self.items[i]}: {self.quantidades[i]}") 23 | 24 | listaDeCompras = ListaDeCompras() 25 | 26 | listaDeCompras.adicionar_item('Pão', 1) 27 | listaDeCompras.adicionar_item('Banana', 5) 28 | listaDeCompras.adicionar_item('Bolacha', 2) 29 | listaDeCompras.adicionar_item('Melancia', 1) 30 | 31 | listaDeCompras.listar_itens() 32 | 33 | listaDeCompras.remover_item('Bolacha') 34 | 35 | listaDeCompras.listar_itens() -------------------------------------------------------------------------------- /filas.py: -------------------------------------------------------------------------------- 1 | class Pedido: 2 | def __init__(self, numero, nome, prato): 3 | self.numero = numero 4 | self.nome = nome 5 | self.prato = prato 6 | 7 | class FilaDePedidos: 8 | def __init__(self): 9 | self.filaPedidos = [] 10 | 11 | def adicionar_pedido(self, numero, nome, prato): 12 | novo_pedido = Pedido(numero, nome, prato) 13 | self.filaPedidos.append(novo_pedido) # Adiciona no final da fila 14 | 15 | def remover_pedido(self): 16 | if len(self.filaPedidos) < 1: 17 | return None 18 | return self.filaPedidos.pop(0) # Remove e retorna o primeiro elemento da fila 19 | 20 | def mostrar_pedidos(self): 21 | if len(self.filaPedidos) < 1: 22 | print("Não há pedidos no momento!") 23 | return 24 | for pedido in self.filaPedidos: 25 | print(f"Número: {pedido.numero}, Nome: {pedido.nome}, Prato: {pedido.prato}") 26 | 27 | 28 | fila = FilaDePedidos() 29 | 30 | fila.adicionar_pedido(1, "João", "Hambúrguer") 31 | fila.adicionar_pedido(2, "Maria", "Pizza") 32 | fila.adicionar_pedido(3, "José", "Sushi") 33 | 34 | fila.mostrar_pedidos() 35 | 36 | pedidoAtendido = fila.remover_pedido() 37 | print(f"Pedido atendido: Número {pedidoAtendido.numero}, Prato: {pedidoAtendido.prato}") 38 | 39 | fila.mostrar_pedidos() -------------------------------------------------------------------------------- /pilhas.py: -------------------------------------------------------------------------------- 1 | class Livro: 2 | def __init__(self, nome, numeroDePaginas): 3 | self.nome = nome 4 | self.numeroDePaginas = numeroDePaginas 5 | 6 | class PilhaDeLivros: 7 | def __init__(self): 8 | self.pilhaLivros = [] 9 | 10 | def adicionar_livro(self,nome, numeroDePaginas): 11 | novo_livro = Livro(nome, numeroDePaginas) 12 | self.pilhaLivros.append(novo_livro) # Adiciona no final da pilha 13 | 14 | def remover_livro(self): 15 | if len(self.pilhaLivros) < 1: 16 | return None 17 | return self.pilhaLivros.pop() # Remove e retorna o último elemento adicionado na pilha 18 | 19 | def mostrar_livro_topo(self): 20 | ultimo_index = len(self.pilhaLivros) - 1 21 | print(f"O livro que está no topo é {self.pilhaLivros[ultimo_index]}") 22 | return self.pilhaLivros[ultimo_index] 23 | 24 | def mostrar_livros(self): 25 | if len(self.pilhaLivros) < 1: 26 | print("Não há livros na pilha no momento!") 27 | return 28 | for livro in self.pilhaLivros: 29 | print(f"Nome: {livro.nome}, número de páginas: {livro.numeroDePaginas}") 30 | 31 | 32 | pilha = PilhaDeLivros() 33 | 34 | pilha.adicionar_livro("A Guerra dos Tronos", 600) 35 | pilha.adicionar_livro("A Fúria dos Reis", 648) 36 | pilha.adicionar_livro("A Tormenta das Espadas", 848) 37 | pilha.adicionar_livro("O Festim dos Corvos", 608) 38 | pilha.adicionar_livro("A Dança dos Dragões", 336) 39 | 40 | pilha.mostrar_livros() 41 | 42 | livroRemovido = pilha.remover_livro() 43 | print(f"Livro removido da pilha: Nome {livroRemovido.nome}, número de páginas: {livroRemovido.numeroDePaginas}") 44 | 45 | pilha.mostrar_livros() -------------------------------------------------------------------------------- /hash-map.py: -------------------------------------------------------------------------------- 1 | class Jogo: 2 | def __init__(self): 3 | self.pontuacao = {} 4 | 5 | def adicionar_jogador(self, usuario): 6 | self.pontuacao[usuario] = 0 7 | 8 | def atualizar_pontuacao(self, usuario, pontos): 9 | if usuario in self.pontuacao: 10 | self.pontuacao[usuario] += pontos 11 | 12 | def remover_jogador(self, usuario): 13 | del self.pontuacao[usuario] 14 | 15 | def listar_pontuacao(self): 16 | if len(self.pontuacao) == 0: 17 | print("Não há jogadores nesta rodada no momento!") 18 | return 19 | ranking = sorted(self.pontuacao.items(), key=lambda x: x[1], reverse=True) 20 | for usuario, pontos in ranking: 21 | print(f"{usuario}: {pontos} pontos") 22 | 23 | def obter_vencedor(self): 24 | max_pontos = max(self.pontuacao.values()) # encontra a maior pontuação 25 | for usuario, pontos in self.pontuacao.items(): 26 | if pontos == max_pontos: 27 | print(f"O usuário {usuario} venceu o jogo com {pontos} pontos!") 28 | return usuario # retorna o nome do jogador com a maior pontuação 29 | 30 | jogo = Jogo() 31 | 32 | jogo.adicionar_jogador('GiMoeller') 33 | jogo.adicionar_jogador('SoccerChamp23') 34 | jogo.adicionar_jogador('MusicManiac') 35 | jogo.adicionar_jogador('FitnessFanatic') 36 | jogo.adicionar_jogador('StarGazer92') 37 | jogo.adicionar_jogador('BookWorm1985') 38 | 39 | jogo.atualizar_pontuacao('GiMoeller', 20) 40 | jogo.atualizar_pontuacao('StarGazer92', 10) 41 | 42 | jogo.listar_pontuacao() 43 | 44 | jogo.remover_jogador('FitnessFanatic') 45 | 46 | jogo.listar_pontuacao() 47 | 48 | jogo.obter_vencedor() 49 | 50 | 51 | -------------------------------------------------------------------------------- /arvores.py: -------------------------------------------------------------------------------- 1 | class Produto: 2 | def __init__(self, id, nome, quantidade): 3 | self.id = id 4 | self.nome = nome 5 | self.quantidade = quantidade 6 | 7 | class Node: 8 | def __init__(self, produto): 9 | self.esquerda = None 10 | self.direita = None 11 | self.produto = produto 12 | 13 | class ArvoreProduto: 14 | def __init__(self): 15 | self.raiz = None 16 | 17 | def inserir_produto(self, id, nome, quantidade): 18 | produto = Produto(id, nome, quantidade) 19 | if self.raiz is None: 20 | self.raiz = Node(produto) 21 | else: 22 | self._inserir_produto(produto, self.raiz) 23 | 24 | def _inserir_produto(self, produto, node): 25 | if produto.id < node.produto.id: 26 | if node.esquerda is None: 27 | node.esquerda = Node(produto) 28 | else: 29 | self._inserir_produto(produto, node.esquerda) 30 | elif produto.id > node.produto.id: 31 | if node.direita is None: 32 | node.direita = Node(produto) 33 | else: 34 | self._inserir_produto(produto, node.direita) 35 | else: 36 | node.produto = produto # se o ID já existe, atualiza as informações do produto 37 | 38 | def buscar_produto(self, id): 39 | return self._buscar_produto(id, self.raiz) 40 | 41 | def _buscar_produto(self, id, node): 42 | if node is None or node.produto.id == id: 43 | return node 44 | elif id < node.produto.id: 45 | return self._buscar_produto(id, node.esquerda) 46 | else: 47 | return self._buscar_produto(id, node.direita) 48 | 49 | arvore = ArvoreProduto() 50 | 51 | arvore.inserir_produto(1, 'Camiseta', 10) 52 | arvore.inserir_produto(2, 'Vestido', 20) 53 | arvore.inserir_produto(3, 'Tenis', 5) 54 | 55 | produtoBuscado1 = arvore.buscar_produto(2) 56 | print(produtoBuscado1.produto.nome) # Retorna o produto 57 | 58 | produtoBuscado2 = arvore.buscar_produto(20) 59 | print(produtoBuscado2) # Retorna None 60 | 61 | -------------------------------------------------------------------------------- /lista-simplesmente-encadeada-head.py: -------------------------------------------------------------------------------- 1 | # Definindo a classe Paciente para representar o nó da lista 2 | class Paciente: 3 | def __init__(self, id, nome, estadoSaude): 4 | self.id = id 5 | self.nome = nome 6 | self.estadoSaude = estadoSaude 7 | self.proximoPaciente = None 8 | 9 | # Definindo a classe ListaDePacientes para representar a lista simplesmente encadeada 10 | class ListaDePacientes: 11 | def __init__(self): 12 | self.head = None 13 | 14 | def adicionar_paciente(self, id, nome, estadoSaude): 15 | novoPaciente = Paciente(id, nome, estadoSaude) 16 | if self.head is None: 17 | # Se a lista estiver vazia, o novo paciente é adicionado como cabeça da lista 18 | self.head = novoPaciente 19 | else: 20 | # Caso contrário, o paciente é adicionado ao final da lista 21 | pacienteAtual = self.head 22 | while pacienteAtual.proximoPaciente is not None: 23 | pacienteAtual = pacienteAtual.proximoPaciente 24 | pacienteAtual.proximoPaciente = novoPaciente 25 | 26 | # Método para remover um paciente da lista, recebe como parâmetro o id do paciente a ser removido 27 | def remover_paciente(self, id): 28 | if self.head is None: 29 | # Se a lista estiver vazia, não há o que remover 30 | return 31 | elif self.head.id == id: 32 | # Se o paciente a ser removido for a cabeça da lista, basta atualizar o ponteiro para o próximo paciente 33 | self.head = self.head.proximoPaciente 34 | return 35 | else: 36 | # Caso contrário, percorremos a lista até encontrar o paciente a ser removido 37 | pacienteAtual = self.head 38 | while pacienteAtual.proximoPaciente is not None: 39 | if pacienteAtual.proximoPaciente.id == id: 40 | # Quando encontramos o paciente, atualizamos o ponteiro do paciente anterior para o próximo paciente 41 | pacienteAtual.proximoPaciente = pacienteAtual.proximoPaciente.proximoPaciente 42 | return 43 | pacienteAtual = pacienteAtual.proximoPaciente 44 | 45 | # Método para imprimir todos os pacientes da lista 46 | def listar_pacientes(self): 47 | if self.head is None: 48 | print("Não há pacientes nesta lista.") 49 | else: 50 | pacienteAtual = self.head 51 | while pacienteAtual is not None: 52 | print(f"Nome: {pacienteAtual.nome}, ID: {pacienteAtual.id}, Estado de saúde: {pacienteAtual.estadoSaude}") 53 | pacienteAtual = pacienteAtual.proximoPaciente 54 | 55 | 56 | listaDePacientes = ListaDePacientes() 57 | 58 | listaDePacientes.adicionar_paciente(1, "Giovanna", "Estável") 59 | listaDePacientes.adicionar_paciente(2, "Lucas", "Tratamento intensivo") 60 | listaDePacientes.adicionar_paciente(3, "Alex", "Crítico") 61 | listaDePacientes.adicionar_paciente(4, "Beatriz", "Estável") 62 | 63 | listaDePacientes.listar_pacientes() 64 | 65 | listaDePacientes.remover_paciente(3) 66 | 67 | listaDePacientes.listar_pacientes() 68 | 69 | -------------------------------------------------------------------------------- /lista-simplesmente-encadeada-head-tail.py: -------------------------------------------------------------------------------- 1 | # Definindo a classe Paciente para representar o nó da lista 2 | class Paciente: 3 | def __init__(self, id, nome, estadoSaude): 4 | self.id = id 5 | self.nome = nome 6 | self.estadoSaude = estadoSaude 7 | self.proximoPaciente = None 8 | 9 | # Definindo a classe ListaDePacientes para representar a lista simplesmente encadeada 10 | class ListaDePacientes: 11 | def __init__(self): 12 | self.head = None 13 | self.tail = None 14 | 15 | def adicionar_paciente(self, id, nome, estadoSaude): 16 | novoPaciente = Paciente(id, nome, estadoSaude) 17 | if self.head is None: 18 | # Se a lista estiver vazia, o novo paciente é adicionado como cabeça e cauda da lista 19 | self.head = novoPaciente 20 | self.tail = novoPaciente 21 | else: 22 | # Caso contrário, o paciente é adicionado ao final da lista 23 | self.tail.proximoPaciente = novoPaciente 24 | self.tail = novoPaciente 25 | 26 | # Método para remover um paciente da lista, recebe como parâmetro o id do paciente a ser removido 27 | def remover_paciente(self, id): 28 | if self.head is None: 29 | # Se a lista estiver vazia, não há o que remover 30 | return 31 | elif self.head.id == id: 32 | # Se o paciente a ser removido for a cabeça da lista, basta atualizar o ponteiro para o próximo paciente 33 | self.head = self.head.proximoPaciente 34 | if self.head is None: # Se a lista tiver ficado vazia, atualiza também a cauda 35 | self.tail = None 36 | return 37 | else: 38 | # Caso contrário, percorremos a lista até encontrar o paciente a ser removido 39 | pacienteAtual = self.head 40 | while pacienteAtual.proximoPaciente is not None: 41 | if pacienteAtual.proximoPaciente.id == id: 42 | # Quando encontramos o paciente, atualizamos o ponteiro do paciente anterior para o próximo paciente 43 | pacienteAtual.proximoPaciente = pacienteAtual.proximoPaciente.proximoPaciente 44 | if pacienteAtual.proximoPaciente is None: # Se o paciente removido for o último, atualiza a cauda 45 | self.tail = pacienteAtual 46 | return 47 | pacienteAtual = pacienteAtual.proximoPaciente 48 | 49 | # Método para imprimir todos os pacientes da lista 50 | def listar_pacientes(self): 51 | if self.head is None: 52 | print("Não há pacientes nesta lista.") 53 | else: 54 | pacienteAtual = self.head 55 | while pacienteAtual is not None: 56 | print(f"Nome: {pacienteAtual.nome}, ID: {pacienteAtual.id}, Estado de saúde: {pacienteAtual.estadoSaude}") 57 | pacienteAtual = pacienteAtual.proximoPaciente 58 | 59 | 60 | listaDePacientes = ListaDePacientes() 61 | 62 | listaDePacientes.adicionar_paciente(1, "Giovanna", "Estável") 63 | listaDePacientes.adicionar_paciente(2, "Lucas", "Tratamento intensivo") 64 | listaDePacientes.adicionar_paciente(3, "Alex", "Crítico") 65 | listaDePacientes.adicionar_paciente(4, "Beatriz", "Estável") 66 | 67 | listaDePacientes.listar_pacientes() 68 | 69 | listaDePacientes.remover_paciente(3) 70 | 71 | listaDePacientes.listar_pacientes() 72 | 73 | -------------------------------------------------------------------------------- /lista-duplamente-encadeada.py: -------------------------------------------------------------------------------- 1 | # Definindo a classe Produto para representar cada item do estoque 2 | class Produto: 3 | def __init__(self, codigo_barras, nome, preco, quantidade): 4 | self.codigo_barras = codigo_barras 5 | self.nome = nome 6 | self.preco = preco 7 | self.quantidade = quantidade 8 | self.proximo_produto = None 9 | self.produto_anterior = None 10 | 11 | # Definindo a classe ListaDeProdutos para representar a lista duplamente encadeada 12 | class ListaDeProdutos: 13 | def __init__(self): 14 | self.head = None 15 | self.tail = None 16 | 17 | def adicionar_produto(self, codigo_barras, nome, preco, quantidade): 18 | novo_produto = Produto(codigo_barras, nome, preco, quantidade) 19 | if self.head is None: 20 | self.head = novo_produto 21 | self.tail = novo_produto 22 | else: 23 | self.tail.proximo_produto = novo_produto 24 | novo_produto.produto_anterior = self.tail 25 | self.tail = novo_produto 26 | 27 | def remover_produto(self, codigo_barras): 28 | if self.head is None: 29 | return 30 | elif self.head.codigo_barras == codigo_barras: 31 | self.head = self.head.proximo_produto 32 | if self.head is not None: 33 | self.head.produto_anterior = None 34 | else: 35 | self.tail = None 36 | return 37 | elif self.tail.codigo_barras == codigo_barras: 38 | self.tail = self.tail.produto_anterior 39 | self.tail.proximo_produto = None 40 | return 41 | else: 42 | produto_atual = self.head 43 | while produto_atual is not None: 44 | if produto_atual.codigo_barras == codigo_barras: 45 | produto_atual.produto_anterior.proximo_produto = produto_atual.proximo_produto 46 | produto_atual.proximo_produto.produto_anterior = produto_atual.produto_anterior 47 | return 48 | produto_atual = produto_atual.proximo_produto 49 | 50 | def atualizar_quantidade(self, codigo_barras, nova_quantidade): 51 | produto_atual = self.head 52 | while produto_atual is not None: 53 | if produto_atual.codigo_barras == codigo_barras: 54 | produto_atual.quantidade = nova_quantidade 55 | return 56 | produto_atual = produto_atual.proximo_produto 57 | 58 | def listar_produtos(self): 59 | if self.head is None: 60 | print("Não há produtos no estoque.") 61 | else: 62 | produto_atual = self.head 63 | while produto_atual is not None: 64 | print(f"Código de barras: {produto_atual.codigo_barras}, Nome: {produto_atual.nome}, Preço: {produto_atual.preco}, Quantidade: {produto_atual.quantidade}") 65 | produto_atual = produto_atual.proximo_produto 66 | 67 | listaDeProdutos = ListaDeProdutos() 68 | 69 | listaDeProdutos.adicionar_produto("001", "Arroz", 10.50, 50) 70 | listaDeProdutos.adicionar_produto("002", "Feijão", 8.90, 30) 71 | listaDeProdutos.adicionar_produto("003", "Macarrão", 5.99, 70) 72 | listaDeProdutos.adicionar_produto("004", "Óleo", 7.50, 20) 73 | 74 | listaDeProdutos.listar_produtos() 75 | 76 | listaDeProdutos.atualizar_quantidade("001", 40) 77 | 78 | listaDeProdutos.listar_produtos() 79 | 80 | listaDeProdutos.remover_produto("003") 81 | 82 | listaDeProdutos.listar_produtos() --------------------------------------------------------------------------------