Tipos Abstractos de Dados (TADs) e Java

Documentos relacionados
Paradigmas de Programação

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Estrutura de Dados Listas

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

JAVA. José de Siqueira UFMG - ICEx - DCC

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Professora Jeane Melo

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

FILAS. As coisas de que uma fila é feita serão chamadas itens. Os itens podem ser números, strings, structs, etc., etc.

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Estruturas de Dados I

BCC202 - Estrutura de Dados I

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Tabelas de Dispersão. Estrutura de Dados e Algoritmos

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Estruturas de dados para listas arrays e listas ligadas

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Tabelas de Dispersão. Tabela de Dispersão

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Universidade Federal do Ma Curso de Ciência da Computação

Lista Encadeada (Linked List)

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Listas Lineares Ordenadas

Estruturas de Dados Aula 11: TAD Pilha

Estruturas de Dados Estruturas de Dados Fundamentais

Lista Encadeada Simples. Métodos Computacionais Victor Casé

ANHANGUERA ESTRUTURA DE DADOS AULA 06 LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS. Prof. Thomás da Costa

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

2. Listas 3. Listas ligadas simples 4. Operações dentro das listas 5. Listas Circulares 6. Listas Duplamente Ligadas 7. Pilhas 8.

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Estruturas de Dados Filas

if (umobjecto!= null && umobjecto instanceof CartaoFidelidade){ titular.equals(((cartaofidelidade) umobjecto).titular) &&

Estruturas de Dados - Filas

Tipos e Estruturas de Dados Profa. Graça Nunes Lista de Exercícios (Listas Encadeadas, Duplamente Encadeadas e Circulares)

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

Listas Lineares. continuando...

Orientação a Objetos AULA 09

Algoritmos e Estruturas de Dados

SCC 202 Prova 1. 28/9/2010 Resolução e Comentários

LISTAS. Profa. Me. Andréa Zotovici. São Paulo 2014

UNIVERSIDADE DA BEIRA INTERIOR

Revisão: Tipo Abstrato de Dados Recursividade

Algoritmos e Estruturas de Dados: Lista Duplamente Encadeada

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Listas Encadeadas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

Disciplina que estuda as técnicas computacionais para a organização e manipulação eficiente de quaisquer quantidades de informação.

Programação Orientada a Objetos II JAVA Décima Aula. Prof. Rogério Albuquerque de Almeida

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 9

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Algoritmos e Estruturas de Dados II IEC013

Tabelas Hash Endereçamento Direto

Lista Ligada Linear - Retirar elemento

Tipos Abstratos de Dados. Estrutura de Dados

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Arrays. int idade1; int idade2; int idade3; int idade4; int[] idades;

pior caso nas operações de manipulação é O(N) pior caso surge sistematicamente emusos correntes (ex: elementos previamente ordenados)

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de dados

Departamento de Ciência de Computadores Estruturas de Dados (CC114)

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Linguagem Algorítmica OO. Linguagem Algorítmica

Prof. Walteno Martins Parreira Júnior

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Algoritmos e Estruturas de Dados II IEC013

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

4 Conceito de Herança

BCC202 - Estrutura de Dados I

Árvores. Prof. César Melo DCC/ICE/UFAM

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Introdução a Programação. Listas Encadeadas

Programação por Objectos. Java

Programação por Objectos. Java

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Aula 7 Encadeamento de Memória

Aplicações de vetores

ESTRUTURAS DE DADOS E ALGORITMOS HEAP BINÁRIA

Árvores. Prof. César Melo DCC/ICE/UFAM

Interfaces e Classes Internas

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Estruturas de Dados Pilhas, Filas, Listas

Linguagem C: Listas Encadeadas

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Transcrição:

Tipos Abstractos de Dados (TADs) e Java Neste capítulo apresentamos a metodologia de desenvolvimento dos TADs em Java, introduzimos o conceito de estrutura linear e sua implementação utilizando a estrutura estática e dinâmica. O QUE SÃO TADS... 1 IMPLEMENTAR TAD EM JAVA... 1 ESTRUTURAS... 2 ESTRUTURA ESTÁTICA... 3 ESTRUTURA DINÂMICA... 4 LISTAS SIMPLESMENTE LIGADAS/ENCADEADAS... 4 Inserir Elemento na Cabeça da Lista... 6 Inserir Elemento na Cauda da Lista... 8 Remoção do nó...9 LISTAS DUPLAMENTE ENCADEADA/LIGADAS... 10 LISTAS CIRCULARES... 12 O que são TADs Na noção de Tipo Abstracto de Dados (TAD) devemos especificar as propriedades fundamentais de um tipo de dado, de um modo independente da sua implementação numa linguagem. Implementar TAD em Java Implementar um tipo abstracto de dados (TAD) envolve três passos: 1. Definição de um API Java (Application Programming Interface), ou simplesmente interface, que descreve os métodos que o TAD suporta e como eles são declarados e usados. 2. Escolha da representação concreta do TAD para usar na implementação. Basicamente vamos considerar dois tipos de representação: Estrutura estática (utilização de tabelas) ou Footer Page 1

Estrutura dinâmica (utilização das listas ligadas/encadeadas, arvores, etc.). 3. Implementação da interface através de uma classe e tendo em conta a representação escolhida no ponto 2. Para todo o TAD pode existir várias implementações, contudo todas as implementações respeitam o interface definido. Estruturas Frequentemente precisamos agrupar vários elementos/dados num conjunto. A partida podemos não saber o número exacto de elementos a ser agrupados. Em cada instante podemos acrescentar ou remover elemento ao conjunto. Em programação consideramos dois tipos de estruturas que permitem guardar uma colecção de elementos: estrutura estática e estrutura dinâmica. Os elementos podem ser organizados de um modo distinto. Entre as organizações possíveis destacam-se: Linear. Existe uma ordem entre os elementos da colecção. O primeiro elemento, o segundo elemento,..., o último elemento. Hierárquica. A organização de elementos pode ser representada em forma de árvore. Grafo. A organização de elementos pode ser representada em forma de rede. Neste capítulo são descritos exemplos de implementação de uma estrutura linear, utilizando uma estrutura estática e uma estrutura dinâmica. Em seguida é apresentado a interface da estrutura linear. interface estruturalinear // verifica se a estrutura tem elementos public boolean estavazia(); // devolve a quantidade de elementos da estrutura public int tamanho(); // insere um elemento no início da estrutura public void inserir(object p0); // insere um elemento no fim da estrutura public void inserircauda(object p0); // remove um elemento do início da estrutura public Object remover(); // remove um elemento do fim da estrutura public Object removercauda(); Algoritmos e Tipos Abstractos de Informação, 2003 Page 2

Estrutura Estática Estrutura estática caracteriza-se por possuir um espaço alocado e inalterável antes da sua utilização. A estrutura estática não pode conter mais elementos do que o previsto inicialmente. A estrutura estática é representada em termos da linguagem de programação JAVA através do uso de tabelas. Numa tabela, uma vez alocado o espaço, este permanece inalterável, independentemente das operações de inserção e de remoção de elementos. Em seguida é apresentado uma implementação da interface estruturalinear por meio da classe ArrayCircularList. Esta implementação baseia-se no uso de uma estrutura estática para guardar os elementos de uma colecção. Optou-se por utilizar uma tabela circular. public class ArrayCircularList implements estruturalinear protected Object[] array; protected int start,end,number; public parraylist(int maxsize) array = new Object[maxsize]; start = end = number = 0; public boolean estavazia() return number == 0; public boolean isfull() return number >= array.length; public int tamanho() return number; public void inserir(object o) if(number < array.length) array[start = (++start % array.length)] = o; number++; public void inserircauda (Object o) if(number < array.length) array[end] = o; end = (--end + array.length) % array.length; number++; public Object remover() if(estavazia()) return null; number--; int i = start; start = (--start + array.length) % array.length; Algoritmos e Tipos Abstractos de Informação, 2003 Page 3

return array[i]; public Object removercauda() if(estavazia()) return null; number--; return array[end = (++end % array.length)]; Estrutura Dinâmica Estrutura dinâmica caracteriza-se por poder ser alterada à medida que ocorre a sua manipulação através de inserção e remoção de elementos. A dimensão da estrutura dinâmica não tem limitações, sendo a sua única restrição a limitação física do espaço de memória do computador onde ocorre a execução do algoritmo. A estrutura dinâmica é criada com a utilização do tipo de dado Referencia (apontador). As estruturas dinâmicas podem ser criadas para representar colecções de elementos com diferentes tipos de organização. A estrutura linear pode ser implementada utilizando estruturas dinâmicas representadas pelas listas simplesmente ligadas, listas duplamente ligadas, listas circulares, etc. Em seguida é apresentado um exemplo de utilização destas listas na implementação de interface estruturalinear. Listas simplesmente ligadas/encadeadas Uma lista encadeada é a forma mais simples de representar uma colecção de elementos que juntos formam uma ordenação linear. Cada elemento da colecção é representado pelo objecto da classe No. A ordenação é determinada armazenando num nó uma referência para um elemento e uma referência, chamada de próximo, para o próximo nó da colecção. Algoritmos e Tipos Abstractos de Informação, 2003 Page 4

Figure 1. Lista encadeada A referência próximo dentro de um nó pode ser vista como uma ligação ou apontador para outro nó. O primeiro e os últimos nós de uma lista são chamados, respectivamente, de cabeça e cauda da lista. A cauda é um nó que tem a referência próximo igual a null, indica o fim da lista. A deslocação de um nó para outro seguindo a referência próximo é conhecido como caminhar na lista / percorrer a lista. Uma lista encadeada definida desta maneira é conhecida como uma lista simplesmente encadeada. Diferente de uma tabela, uma lista simplesmente encadeada não tem tamanho fixo pré-determinado e aloca espaço proporcionalmente ao número de elementos. Para implementar uma lista simplesmente encadeada em Java, é definida a seguir uma classe No: class No private Object elemento; private No proximo; // construtores public No( ) this( null, null ); public No( Object e, No p ) elemento = e; proximo = p; void setelemento( Object novoelemento ) elemento = novoelemento; Algoritmos e Tipos Abstractos de Informação, 2003 Page 5

void setproximo( No novoproximo ) proximo = novoproximo; Object getelemento( ) return elemento; No getproximo( ) return proximo; A interface estruturalinear pode ser implementada usando uma lista simplesmente encadeada na classe ListaEncadeada da seguinte maneira: class ListaEncadeada implements estruturalinear // Referência para a cabeça da lista private No cabeca; // Referência para a cauda da lista private No cauda; // Número de elementos na lista private int tamanho; public ListaEncadeada ( ) // Inicializa a lista cabeca = null; cauda = null; tamanho = 0; public int tamanho( ) //Retorna o tamanho actual da lista return tamanho; public No getcabeca( ) //Retorna retefencia da cabeca da lista return cabeca; public No getcauda( ) //Retorna retefencia da cauda da lista return cauda; public boolean estavazia() return tamanho == 0;... Inserir Elemento na Cabeça da Lista Numa lista simplesmente encadeada podemos inserir ou remover um elemento na cabeça da lista no tempo de execução O(1). Algoritmos e Tipos Abstractos de Informação, 2003 Page 6

Figure 2. Antes da inserção Figure 3. Criar novo nó Figure 4. Depois da inserção O código para esta operação é o seguinte: public void inserir(object obj ) No aux = new No (obj, cabeca); if (estavazia()) cauda = aux; cabeca = aux; tamanho ++; Algoritmos e Tipos Abstractos de Informação, 2003 Page 7

Inserir Elemento na Cauda da Lista Se não tiver a referencia para o último elemento da lista (cauda), o tempo de execução desta operação é O(n). Isto porque temos que aceder ao endereço do último elemento da lista percorrendo todos os elemento a partir da cabeça da lista. Como no nosso exemplo a representação escolhida para a lista possui uma variável com a referencia para o último elemento (cauda), o tempo de execução desta operação é O(1). Figure 5. Antes da inserção Figure 6. Criar novo no Figure 7. Depois da inserção O código para esta operação é o seguinte: public void inserircauda(object obj ) Algoritmos e Tipos Abstractos de Informação, 2003 Page 8

No aux = new No (obj, null); if (estavazia()) cabeca = aux; else cauda.setproximo(aux); cauda = aux; tamanho ++; Remoção do nó Podemos remover um No de cabeça ou de cauda da lista. O método seguinte permite remover o elemento da cabeça da lista. public Object remover() Object obj = null; if (!estavazia()) obj = cabeca.getelemento(); if (cabeca == cauda) cauda = null; cabeca = cabeca.getproximo(); tamanho --; return obj; A remoção do elemento de cauda da lista obriga percorrer os elementos desde a cabeça da lista até ao penúltimo elemento. public Object removercauda() Object obj = null; if (!estavazia()) obj = cauda.getelemento(); if (tamanho() == 1) cabeca = null; cauda = null; else No aux = cabeca; while (aux.getproximo().getproximo()!= null) aux = aux.getproximo(); aux.setproximo(null); cauda = aux; tamanho --; return obj; Algoritmos e Tipos Abstractos de Informação, 2003 Page 9

Listas duplamente encadeada/ligadas Cada No da lista duplamente encadeada possui uma ligação não só para o próximo elemento, mas também para o elemento anterior da lista. Esta variante da lista simplesmente encadeada permite a inserção e a remoção na cabeça e na cauda da lista com o tempo de execução O(1). Para implementação deste tipo de lista devemos especificar classe NoD composto por elemento, referência para o elemento seguinte e referência para o elemento anterior. O código desta classe é o seguinte: class NoD private Object elemento; private NoD prox; private NoD prev; public NoD(Object e) elemento=e; prox=null; prev=null; public Object getelemento()return elemento ; public NoD getprox()return prox ; public void setprox(nod no) prox=no; public NoD getprev()return prev ; public void setprev(nod no) prev=no; Assim o código para lista dupla é o seguinte: class ListaDupla implements estruturalinear private NoD cabeca; // guarda o inicio private NoD cauda; // guarda o fim int tam; public ListaDupla() tam=0; cabeca=cauda=null; Algoritmos e Tipos Abstractos de Informação, 2003 Page 10

public NoD getcabeca() return cabeca; public boolean estavazia() return (tam==0); public int tamanho() return tam; public void inserir(object e) NoD novo=new NoD(e); if(estavazia()) cabeca=cauda=novo; else cabeca.setprev(novo); novo.setprox(cabeca); cabeca=novo; tam++; public void inserircauda(object e) NoD novo=new NoD(e); if(estavazia()) cabeca=cauda=novo; else cauda.setprox(novo); novo.setprev(cauda); cauda=novo; tam++; public Object remover() Object aux = null; if(!estavazia()) aux = cabeca.getelemento(); if (tam==1) cabeca=cauda=null; else cabeca=cabeca.getprox(); cabeca.setprev(null); Algoritmos e Tipos Abstractos de Informação, 2003 Page 11

tam--; return aux; Listas circulares Listas circulares são listas onde o primeiro e último elemento estão ligados. Podemos utilizar a estrutura dinâmica simplesmente encadeada ou duplamente encadeada para implementação da lista circular. Algoritmos e Tipos Abstractos de Informação, 2003 Page 12