Estruturas de Dados Prof. Vilson Heck Junior Introduo Tradicionalmente conhecidos como Tipos de Dado Abstrato, so algumas Estruturas de Dados bsicas e importantes para a construo de algoritmos mais bem elaborados; Nas prximas aulas, aprenderemos o que so listas, filas e pilhas, bem como aprenderemos utiliz-las para resolver alguns problemas computacionais. LISTAS - INTRODUO Listas, Filas e Pilhas Listas Listas so conjuntos de elementos, objetos, variveis, tarefas, ou qualquer coisa que se possa enumerar e formar um conjunto; As listas esto presentes em nossa vida, desde o nosso nascimento, por exemplo, com a lista de compras que nossos pais tiveram que fazer para ns. Listas Exemplo de Lista de Compras: 5Kg de farinha; 2Kg de aucar; 500g de carne moda; 2Kg de arroz; 4L de leite; 1Kg de feijo; Etc.. Listas Exemplo de Lista Telefnica: Asdf de Zxcv: (44) 4444-4444 Beutrano Cruz: (33) 3333-3333 Ciclano da Silva: (22) 2222-2222 Fulano de Tal: (11) 1111-1111 COMPORTAMENTO DE UMA LISTA Listas, Filas e Pilhas Comportamento de uma Lista Lista: Vazia! Comportamento de uma Lista Lista: Inserir C C Comportamento de uma Lista Lista: C Comportamento de uma Lista Lista: Inserir D C D Comportamento de uma Lista Lista: C D Comportamento de uma Lista Lista: Inserir B B C D Comportamento de uma Lista Lista: B C D Comportamento de uma Lista Lista: Inserir F B C D F Comportamento de uma Lista Lista: B C D F Comportamento de uma Lista Lista: Inserir E B C D E F Comportamento de uma Lista Lista: B C D E F Comportamento de uma Lista Lista: B C D E F Comportamento de uma Lista Lista: Remover B B C D E F Comportamento de uma Lista Lista: Remover B B C D E F Comportamento de uma Lista Lista: C D E F Comportamento de uma Lista Lista: Remover F C D E F Comportamento de uma Lista Lista: Remover F C D E F Comportamento de uma Lista Lista: C D E Comportamento de uma Lista Lista: Remover D C D E Comportamento de uma Lista Lista: Remover D C D E Comportamento de uma Lista Lista: C E LISTAS - IMPLEMENTAO Listas, Filas e Pilhas Listas Implementando as listas: As listas podem ser implementadas de vrias formas, mas num aspecto mais geral podemos separar em duas principais: EmArrays; ou Encadeadas. Listas em Arrays Em Arrays: Imagine que a lista anterior tinha posies fixas e pr- determinadas: Um array uma estrutura com posies fixas, cada elemento da lista deve ser colocado em uma posio no array; Ao inserir ou excluir um elemento, talvez seja necessrio realocar todos os demais elementos. Listas em Arrays Prs: Criar um array de qualquer tamanho muito simples; No h necessidade de compreender ponteiros ou referncias; Contras: Limitaes quanto ao tamanho de memria; Custo computacional maior; Alocao de memria exagerada. Listas Encadeadas Encadeado, Dicionrio Houaiss: adjetivo 1. disposto ou ligado por ou como por cadeias; ordenado, junto; 2. preso, submetido; Listas Encadeadas Prs: Extremamente eficiente no custo de memria e de processamento; Nunca acarreta em movimentar todos os elementos; Contras: Envolve conceitos mais avanados de programao: Ponteiros ou Referncias. Listas Encadeadas Para criarmos uma lista encadeada, precisamos primeiro definir o que ser armazenado nela; Por exemplo, para criarmos uma lista de contatos, gostaramos de armazenar os nomes, telefones e e-mails de diversas pessoas: Exemplo de elemento Contato da lista: Listas Encadeadas Contato string Nome; long Telefone; string Email; Listas Encadeadas Exemplo da Idia de Encadeamento: Mas como fazer isto? Contato string Nome; long Telefone; string Email; Contato string Nome; long Telefone; string Email; Contato string Nome; long Telefone; string Email; Listas Encadeadas Conforme vamos criando elementos na memria do computador, estes elementos vo ficando espalhados e desconexos; Para criar listas encadeadas precisamos criar elementos que faam referncia a outro elemento, ou seja, indiquem onde podemos encontrar um outro elemento. Exemplo de elemento encadeado: Listas Encadeadas Contato string Nome; long Telefone; string Email; Contato Proximo; Listas Encadeadas Exemplo com Elemento Encadeado: Contato string Nome = abc long Telefone = 123 string Email = a@b Contato Proximo = Contato string Nome = zxy long Telefone = 987 string Email = c@d Contato Proximo = Contato string Nome = qwe long Telefone = 546 string Email = r@f Contato Proximo = Listas Encadeadas Exemplo Duplamente Encadeado: Contato string Nome = abc long Telefone = 123 string Email = a@b Contato Proximo = Contato Anterior = Contato string Nome = zxy long Telefone = 987 string Email = c@d Contato Proximo = Contato Anterior = Contato string Nome = qwe long Telefone = 546 string Email = r@f Contato Proximo = Contato Anterior = Listas Encadeadas Iniciando uma lista vazia: Contato Inicio_Lista = null; Contato Fim_Lista = null; O valor de referncia null usado para quando ainda no existe umobjeto na memria para qual a varivel ir fazer referncia; O ltimo elemento da lista aponta para null. Iniciando uma lista com 1 elemento: Contato Inicio_Lista = new Contato(); Listas Encadeadas Criando a Lista: Contato Inicio_Lista = new Contato(); Contato Fim_Lista = Inicio_Lista; Inicio_Lista.Nome = abc; Inicio_Lista.Telefone = 123; Inicio_Lista.Email = a@b; Inicio_Lista.Proximo = null; Contato string Nome = abc long Telefone = 123 string Email = a@b Contato Proximo = Listas Encadeadas Adicionando um segundo elemento: Contato novo = new Contato(); novo.Nome = zxy; novo.Telefone = 987; novo.Email = c@d; novo.Proximo = null; Fim_Lista.Proximo = novo; Fim_Lista = novo; Contato string Nome = abc long Telefone = 123 string Email = a@b Contato Proximo = Contato string Nome = zxy long Telefone = 987 string Email = c@d Contato Proximo = Listas Encadeadas Percorrendo a lista: Contato aux = Inicio_Lista; while (aux != null) { //Faz alguma tarefa com o elemento aux aux = aux.Proximo; } Listas Encadeadas Removendo o elemento zxy: Inicio_Lista.Proximo = null; Contato string Nome = abc long Telefone = 123 string Email = a@b Contato Proximo = Contato string Nome = zxy long Telefone = 987 string Email = c@d Contato Proximo = LISTAS ENCADEADAS EM JAVA Listas, Filas e Pilhas Outras Funes Listar? Pesquisar? Remover? FILAS Listas, Filas e Pilhas Filas O que uma fila em nosso cotidiano? As filas so diferentes das listas? Em quais sentidos? Onde usamos filas em nosso cotidiano? Detalhe o funcionamento de uma fila. Filas Existem muitos exemplos de fila no mundo real: Uma fila de banco; No ponto de nibus; Um grupo de carros aguardando sua vez no pedgio; Entre outros. Filas Uma fila um conjunto de itens a partir do qual podem-se eliminar itens numa extremidade (chamada incio da fila) e no qual podem-se inserir itens na outra extremidade (chamada final da fila). Filas Filas so casos especiais de listas; Obs: Nas listas, quando precisvamos criar um novo elemento, poderamos inseri-lo ou remov-lo de qualquer posio da lista, exemplos: Na primeira posio; Na ltima posio; ou Em qualquer parte no meio da lista. Filas Numa fila existe uma regra bsica a ser seguida: Primeiro a Chegar o Primeiro a Sair; Do ingls: FIFO First In, First Out; Um novo elemento da fila somente pode ser inserido na ltima posio(fim da fila); Um elemento s pode ser removido da primeira posio (inicio da fila). Filas Tem um sentido de chegada: Fila vazia. Inicio da Fila Fim da Fila Filas Inserindo Elementos: Inserir o elemento G G Inicio da Fila Fim da Fila Filas Inserindo Elementos: O elemento entra na ltima posio. G Inicio da Fila Fim da Fila Filas Inserindo Elementos: E avana at a primeira posio disponvel. G Inicio da Fila Fim da Fila Filas Inserindo Elementos: Inserir o elemento B G Inicio da Fila Fim da Fila B Filas Inserindo Elementos: O elemento entra na ltima posio G Inicio da Fila Fim da Fila B Filas Inserindo Elementos: E avana at a primeira posio disponvel. G Inicio da Fila Fim da Fila B Filas Inserindo Elementos: Inserir o elemento D G Inicio da Fila Fim da Fila B D Filas Inserindo Elementos: O elemento entra na ltima posio G Inicio da Fila Fim da Fila B D Filas Inserindo Elementos: E avana at a primeira posio disponvel. G Inicio da Fila Fim da Fila B D Filas Removendo Elementos: Remover o elemento B? No podemos remover elementos que no estejam no inicio da fila! Da mesma forma, o elemento D no pode ser removido! G Inicio da Fila Fim da Fila B D Filas Removendo Elementos: Remover o elemento da fila: Retiramos o primeiro elemento da fila; Neste momento o elemento deve ser utilizado. G Inicio da Fila Fim da Fila B D Filas Removendo Elementos: Remover o elemento da fila: E os demais elementos avanam na fila. G Inicio da Fila Fim da Fila B D Filas Exemplos de uso de filas na computao: Filas de impresso: Impressoras tem uma fila, caso vrios documentos sejam impressos, por um ou mais usurios, os primeiros documentos impressos sero de quem enviar primeiro; Filas de processos: Vrios programas podem estar sendo executados pelo sistema operacional. O mesmo tem uma fila que indica a ordem de qual ser executado primeiro; Filas de tarefas: Um programa pode ter um conjunto de dados para processar. Estes dados podem estar dispostos em uma fila, onde o que foi inserido primeiro, ser atendido primeiro. Filas Variaes de Filas: Fila de Prioridades: Cada item tem uma prioridade. Elementos mais prioritrios podem ser atendidos antes, mesmo no estando no inicio da fila; Fila Circular: Neste tipo de fila os elementos nem sempre so removidos ao serem atendidos, mas voltam ao fim da fila para serem atendidos novamente mais tarde. IMPLEMENTANDO FILAS Listas, Filas e Pilhas Filas As Trs Operaes Bsicas de uma Fila: Inserir(q, x) insere o item x no final da fila q; (Ingls - Enqueue) x = Remover(q) elimina o primeiro elemento da fila q e define x com seu contedo; (Ingls Dequeue) Vazia(q) verifica se a fila esta est vazia, retornando Verdadeiro caso esteja vazia e Falso caso hajam elementos na fila. (Ingls Empty) Filas As filas podem ser implementadas em listas encadeadas ou em vetores; Vetores: Devemos ter duas variveis indicando a posio do inicio e do fim da fila; Lista Encadeada: Devemos ter duas referncias, uma ao elemento de inicio da fila e outra ou elemento do fim da fila. Filas Criar a fila Vazia: Contato Inicio_Fila = null; Contato Fim_Fila = null; Verificar se a fila esta vazia: public static boolean Vazia(Contato inicio) { if (inicio == null) { return true; } else { return false; } } Filas Inserindo Elementos (ao fim): Contato Novo = new Contato(); //Preenche valores do Novo contato if (vazia(Inicio_Fila)) { Inicio_Fila = Novo; } else { Fim_Fila.Proximo = Novo; } Fim_Fila = Novo; Filas Removendo Elemento: Contato x = Inicio_Fila; if ( vazia(Inicio_Fila) == false ) { Inicio_Fila = Inicio_Fila.Proximo; } //Utiliza ou retorna o elemento x... PILHAS Listas, Filas e Pilhas Pilhas Um dos conceitos mais teis na cincia da computao o de pilha; Pilhas Como eram as listas? Insere, remove ou utiliza qualquer elemento inserido; Como eram as filas? Insere apenas no fim da fila, utiliza e remove apenas o primeiro elemento inserido; Pilhas Como so as Pilhas? Insere-se elementos no topo da pilha; Remove-se ou utiliza-se apenas o elemento que estiver no topo da pilha! LIFO (ou FILO): Last In, First Out; ltimo a entrar, primeiro a sair; Pilhas Operaes em Pilhas: Empilhar(p, x) insere um novo elemento x no topo da pilha p; Ingls: Push x = Desempilhar(p) remove o elemento do topo da pilha e retorna para x; Ingls: Pop bool vaz = PilhaVazia(p) verifica se a pilha p esta vazia; Ingls: Empty Pilhas Pilha Vazia: Topo = null; Pilha p Pilhas Pilha Vazia: Topo = null; Inserindo elemento Z Z Pilha p Pilhas Pilha Vazia: Topo Pilha p Z Pilhas Z Y Pilha Vazia: Topo Inserindo elemento Y Pilha p Pilhas Z Y Pilha Vazia: Topo Pilha p Pilhas Z Y Pilha Vazia: Topo Inserindo elemento X X Pilha p Pilhas Z Y Pilha Vazia: Topo X Pilha p Pilhas Z Y Pilha Vazia: Topo Retirar o elemento Y? No. X Pilha p Pilhas Z Y Pilha Vazia: Topo Aux = Desempilhar(p); X Pilha p Aux Pilhas Z Y Pilha Vazia: Topo Aux2 = Desempilhar(p); X Pilha p Aux Aux2 Pilhas As pilhas podem ser implementadas em listas encadeadas ou em vetores; Vetores: Ter uma varivel indicando a posio do topo da pilha; Lista Encadeada: Devemos ter uma referncia ao elemento do topo da pilha. Pilhas Criar a pilha vazia: Contato Topo_Pilha = null; Verificar se a pilha esta vazia: public static boolean Vazia(Contato Topo_Pilha) { if (Topo_Pilha == null) { return true; } else { return false; } } Pilhas Inserindo Elementos: Contato Novo = new Contato(); //Preenche valores do Novo contato Novo.Proximo = Topo_Pilha; Topo_Pilha = Novo; Pilhas Removendo Elemento: Contato x = Topo_Pilha; if (Topo_Pilha != null) { Topo_Pilha = Topo_Pilha.Proximo; } //Utiliza ou retorna o elemento x...