4. Listas, Pilhas, e Filas

Documentos relacionados
4. Listas, Pilhas, e Filas

CES-11. Pilhas Definição Operações Filas. Operações Deques. Definição. Operações

Orientação a Objetos AULA 09

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 17 a Aula Tipos abstratos

Programação Funcional 13 a Aula Tipos abstratos

Estrutura de Dados: Aula 3 - Linguagem C

Estruturas de Dados Encadeadas

Grupo 2 - Implementação de uma Classe Simples

Árvores e Mapas. Luís Lopes. Estruturas de Dados DCC-FCUP

Pilhas Filas e Listas

Filas. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Programação Orientada a Objetos

Bit (Binary Digit) é a menor unidade de armazenamento de informação dentro do computador; Byte é a união de 8 bits capaz de representar 256

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

Algoritmos e Estruturas de Dados 2005/2006

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

Paradigmas de Programação

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação com genéricos

Algoritmos e Estruturas de Dados 2007/2008

PCC104 - Projeto e Análise de Algoritmos

8. Árvores. Fernando Silva DCC-FCUP. Estruturas de Dados. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

8. Árvores. Fernando Silva. Estruturas de Dados DCC-FCUP. Fernando Silva (DCC-FCUP) 8. Árvores Estruturas de Dados 1 / 38

Exame de Estruturas de Dados 2010.Junho.26

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Algoritmos e Estruturas de Dados

08/08/2011. Pilha. SCC0202 Algoritmos e Estruturas de Dados I. Prof. Thiago A. S. Pardo. Pilha. O que é? Para que serve?

Listas Ligadas, Pilhas e Filas

Fila e Deque. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Recursividade UFOP 1/48

Grupo 2 - Implementação de uma classe simples

Instituto Luterano de Ensino Superior de Ji-Paraná Curso Bacharelado em Informática Estrutura de Dados I Prof.: José Luiz A.

Programação Orientada a Objetos (utilizando C#) Professor Emiliano S. Monteiro Versão 20 Jan/2017.

Pilhas. ser acessada somente por uma de suas extremidades. pelo topo. S Uma pilha é uma estrutura linear de dados que pode

Estrutura de dados - Listas Encadeadas

Estruturas Compostas Parte II

Exame de Admissão. Instituto Nacional de Pesquisas Espaciais 18 de setembro de 2018 A: GABARITO

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

Estruturas de dados para listas arrays e listas ligadas

Algoritmos e Estruturas de Dados II IEC013. TAD, Pilhas e Filas. Prof. César Melo

Aplicações de listas Outras estruturas

Coleções. João Paulo Q. dos Santos

Coleção de Dados. Coleções de Dados Classificação 4/1/2011

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

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Revisão de TDA, Pilhas e Filas

ESTRUTURA DE DADOS (TCC )

FICHA 8 PILHAS E FILAS

FCUP 2010/11. Departamento de Ciência de Computadores Estruturas de Dados (CC114) 1 o Teste: 27/Abril/2011

Lista Ligada. Nó de Lista Ligada

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

Estruturas de Dados Pilhas, Filas, Listas

Algoritmos e estrutura de dados

Fila. Algoritmos e Estruturas de Dados I

Estruturas de Dados Pilhas, Filas, Listas

Aplicações de listas e outras estruturas

Desafios de Programação TCC Turma A-1

Estruturas de Dados Filas

Fila. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Aula 5 e 6 Pilhas e suas Aplicações. prof Leticia Winkler

Filas Implementação Sequencial

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

Listas Ligadas, Pilhas e Filas

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

Programação Orientada a Objetos

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

Estrutura de Dados. Aleardo Manacero Jr.

Programação Orientada a Objetos para Redes de Computadores

3.2.2 Pilha (LIFO - last in, first out) - Inserção e remoção apenas no final da lista.

SCC Algoritmos e Estruturas de Dados I

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

Universidade Federal do Espírito Santo Centro de Ciências Agrárias CCA UFES Departamento de Computação. Estruturas de Dados

TCC Prof.: Leandro A. F. Fernandes Conteúdo: Listas Lineares

Exercícios: Árvores. Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de estrutura de dados em linguagem C

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

A classe ArrayList. IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

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

Estruturas de Dados - Filas

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

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

Prova de Recuperação PMR3201 1o. semestre 2017 Prof. Thiago Martins

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Algoritmos e Tipos Abstractos de Informação

Estruturas de dados e algoritmos fundamentais

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

# Estrutura de Dados # Aula 06 Pilhas Estáticas. Prof. Leinylson Fontinele Pereira

Nome: Número: Primeira Parte (7 valores) Segunda Parte (3 valores)

PCC104 - Projeto e Análise de Algoritmos

ESTRUTURAS DE DADOS (LEI, LEE) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

ESTRUTURAS DE DADOS (LEI, LM, LEE) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2018/2019

Universidade de São Paulo

Algoritmos e Programação II. Coleções. Coleções. Baseado no material do Prof. Julio

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

Transcrição:

4. Listas, Pilhas, e Filas Fernando Silva DCC-FCUP Estruturas de Dados Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 1 / 49 Definição de Lista (1) Uma lista é uma sequência finita de elementos ligados entre si Em que, cada elemento (ou nó) da lista tem a seguinte estrutura: um atributo com o valor do elemento, e um atributo com uma referência para o próximo elemento da lista (será nula se for o último elemento). a ordem dos elementos na lista é relevante. os elementos de uma lista são todos do mesmo tipo. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 2 / 49

Definição Recursiva de Lista (2) Uma lista L é uma sequência finita de elementos em que: L ou é uma lista vazia (0 elementos), ou L é uma lista composta por um elemento H (cabeça da lista) seguido de um resto de lista RL com os restantes elementos. Escrito de outra forma (notação do Prolog): L= [] (lista vazia) L= [H RL] (cabeça H, seguida do resto de lista RL) Verificar se X é membro de uma lista L: member(x,[x _]). % X ou está na cabeça da lista member(x,[_ RL]):- member(x,rl).% ou está no resto da lista Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 3 / 49 Definição TAD-Lista (3) Um TAD-lista define-se como uma sequência de elementos: onde cada elemento é caracterizado por uma estrutura com dois atributos: um valor do elemento corrente (e.g. inteiro, objecto, etc), e uma referência para elemento seguinte. e um conjunto de operações a realizar sobre a sequência: addfirst(val) inserir val no início da lista addlast(val) inserir val no fim da lista add(val, index) inserir val na posição index removefirst() remover o primeiro elemento remove(index) remover o elemento na posição index removelast() remover o último elemento get(index) retornar o elemento na posição index indexof(val) retorna a posição da 1a ocorrência de val empty() verificar se a lista está vazia Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 4 / 49

Definição de Lista Ligada (class ListNode) Comecemos por definir uma classe Java ListNode que represente um elemento (nó) de uma lista (e.g. de inteiros): Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 5 / 49 Percorrer Listas Ligadas Como escrever os elementos da lista? começar num elemento da lista (o primeiro) enquanto não chegar ao fim da lista escrever o elemento corrente e avançar para o elemento seguinte Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 6 / 49

Listas Ligadas (class LinkedIntList) Na definição de lista é determinante saber qual é o primeiro elemento da lista. Uma lista fica caracterizada por uma classe LinkedIntList com first - referencia 1 o elemento (um ListNode). size - mantém o n o de elementos na lista. e os métodos que manipulam os elementos da lista. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 7 / 49 Listas Ligadas (class LinkedIntList) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 8 / 49

Métodos que percorrem a lista (print()) Escrever os elementos da lista: Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 9 / 49 Métodos que percorrem a lista: size() e indexof() Comprimento da lista: calcular o número de elementos na lista. Procurar a posição na lista da 1a. ocorrência de v; retornar -1 se v não existir na lista (podia gerar uma excepção). Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 10 / 49

Inserir um elemento numa lista Inserir numa lista vazia: Inserir à cabeça da lista: Implementação: Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 11 / 49 Inserir um elemento numa lista Inserir na posição dada por index (e.g. l.add(5, 2);): A posição index tem de obdecer a 0 <= index <= size-1, em que size é o número de elementos na lista. Se index==0 então corresponde a inserir no início da lista. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 12 / 49

Implementação do método add() Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 13 / 49 Remover o primeiro elemento da lista Remover o primeiro elemento da lista: Implementação: Notas: Não estamos a tratar o caso de a lista poder estar vazia. Não retornamos o elemento devolvido! Deve usar-se o método get() antes de remover. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 14 / 49

Remover um elemento da lista remove() Remover da lista o elemento da posição index: Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 15 / 49 Obter o valor de um elemento da lista get() Retornar o valor do elemento na posição index da lista: Notas: Nos vários métodos, por simplicidade, não verificamos situações de excepção! Os métodos get() e remove() têm de satisfazer 0 index size 1 (o que garante que a lista não está vazia)! Os métodos getfirst() e removefirst() têm de satisfazer que a lista não está vazia. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 16 / 49

Exemplo com a classe LinkedIntList Programa que manipula objectos da classe LinkedIntList: Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 17 / 49 Listas de objectos genéricos Em vez de definirmos listas de inteiros podemos ter listas de objectos genéricos, usando Object: Veremos mais adiante uma definição mais completa, usando tipos genéricos. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 18 / 49

TAD Pilha (Stack) Uma pilha é um caso especial de uma lista. Podemos definir uma pilha restringindo as operações sobre o TAD-lista do seguinte modo: 1 apenas podemos adicionar na primeira posição da lista, 2 apenas podemos remover o primeiro elemento da lista. Estas restrições fazem com que uma pilha seja também designada por uma lista LIFO (last-in-first-out). Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 19 / 49 TAD Pilha (Stack) - definição Um TAD-pilha é uma sequência de elementos, S = [a 1, a 2,..., a n ], em que a n é o elemento mais recente da sequência (ou elemento do topo da pilha), juntamente com as operações: 1. x = pop(s) remove e retorna o elemento no topo de S 2. push(x, S) insere x no topo de S 3. top(s) retorna a n, o elemento no topo de S (mas não altera S) 4. isempty(s) retorna true se S estiver vazio, false caso contrário. 5. isfull(s) retorna true se S estiver cheio, false caso contrário. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 20 / 49

Uma interface Pilha (Stack) A interface define as assinaturas dos métodos públicos do TAD-Pilha (comentários em Javadoc). Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 21 / 49 Uma interface Pilha (Stack) (2) Duas implementações possíveis: com vectores com listas ligadas Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 22 / 49

Pilhas em Java usando vectores (1) Podemos implementar a classe Stack usando vectores e objectos genéricos. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 23 / 49 Pilhas em Java usando vectores (2) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 24 / 49

Pilhas em Java usando listas Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 25 / 49 Exemplo com pilhas: inverter uma sequência de valores Problema: escrever um programa em que dado um valor inteiro, e por recurso a uma pilha, inverta uma lista com os seus divisores primos por ordem decrescente. Por exemplo, dado 2100 o resultado devia ser: 7 5 5 3 2 2. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 26 / 49

Exemplo com pilhas (cont.) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 27 / 49 TAD-Fila (Queue) (1) Uma fila difere de uma pilha na medida em que opera na base de um FIFO (first-in-first-out). Assim, 1 adicionamos novos elementos ao fim da fila, e 2 removemos sempre do princípio da fila. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 28 / 49

TAD-Fila (Queue) (2) Um TAD-fila é uma sequência de elementos, F = [a 1, a 2,..., a n ], em que a 1 é o primeiro elemento da fila e a n é o último, juntamente com as seguintes operações (asseguram que funciona como um FIFO): 1. init() inicializa a fila em vazio; 2. isempty() verifica se a fila está vazia; 3. isfull() verifica se a fila está cheia; 4. add(x) adiciona x na última posição da fila; 5. peek() retorna o valor do 1o elemento da fila; 2. remove() remove o 1o. elemento da fila e retorna esse valor; Aplicações: simulação de filas (bancos, supermercados, atendimento público, etc.), implementação a baixo nível da leitura da linha de comando, pesquisa breadth-first de uma árvore, etc. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 29 / 49 Uma interface Fila (Queue) (1) Descreve os nomes dos métodos públicos do TAD-Fila, como são declarados e usados (comentários em Javadoc). Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 30 / 49

Uma interface Fila (Queue) (2) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 31 / 49 Implementação de filas: vector circular (1) A ideia é representar a fila por um vector circular, em que first e last são cursores do vector que apontam para o início e fim da fila. Condições importantes a verificar: quando os cursores estiverem na última posição do vector, cap-1, e forem incrementados devem passar para a posição 0; verificar se a lista está vazia: verificar se size==0, em que size é o número de elementos na fila, ou, a lista está vazia se first==last. verificar se a lista está cheia: verificar se size==cap, em que size é o número de elementos na fila e cap a capacidade do vector., ou, a lista está cheia se ((last+1)%max)==first (obriga a deixar uma posição por usar no vector); Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 32 / 49

Implementação de filas: vector circular (2) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 33 / 49 Implementação de filas: vector circular (3) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 34 / 49

Implementação de filas: listas ligadas (1) A implementação dos métodos segue de perto a implementação de listas ligadas. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 35 / 49 Implementação de filas: listas ligadas (2) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 36 / 49

Listas duplamente ligadas Uma lista duplamente ligada é uma sequência de elementos em que cada elemento, com excepção do primeiro e último, contém um valor e referências para o elemento anterior e elemento seguinte. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 37 / 49 Implementação de listas duplamente ligadas Um nó de uma lista duplamente ligada fica caracterizado pela classe DLNode: Nota: veremos mais tarde que podemos substituir o tipo Object por um tipo de dados genérico. Toda a restante definição será idêntica. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 38 / 49

Implementação de listas duplamente ligadas Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 39 / 49 Dequeues: Double-Ended Queues (deque ou dequeue) Uma Deque (pronuniciar Deck ) é uma fila com dupla terminação, sendo possível operações de inserção e remoção no início ou fim da fila. Um TAD-deque pode ser visto como uma sequência de elementos duplamente ligados sobre os quais é possível ter as seguintes operações (além das habituais sobre filas): insertfirst(x) insertlast(x) removefirst() removelast() insere x no início da deque. insere x no fim da deque. remove e retorna primeiro elemento. remove e retorna último elemento. A implementação de uma deque deve ser feita com listas duplamente ligadas. Usará a classe DLNode. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 40 / 49

Implementação de Dequeues: classe e addlast() Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 41 / 49 Implementação de Dequeues: método removelast() Exercício: Implemente os restantes métodos de uma dequeue: addfirst(), removefirst(), isdequeueempty(). Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 42 / 49

Implementação de Dequeues: classe exemplo de uso O programa coloca os números de 10 a 1 no início da fila, desse modo invertendo essa sequência, e coloca no fim da fila os números de 11 a 20. Ao retirarmos um elemento do início e outro do fim, obtem-se pares da forma: (1,20), (2,19),... Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 43 / 49 Vectores vs. Listas Ligadas vs. Duplamente Ligadas Muitos TADs podem ser implementados usando vectores ou listas ligadas. Qual será a melhor aproximação? os vectores são melhores para acesso aleatório; listas são melhores para operações de adição e remoção de elementos; listas duplamente ligadas para operações que requeiram movimentos nas duas direcções da lista; listas evitam as ineficientes operações de redimensionamento de capacidade. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 44 / 49

Listas, pilhas e filas pré-definidas em Java Existem classes pré-definidas no Java na package java.util que permitem usar estruturas como listas, dequeues, filas e pilhas. Stacks com objectos genéricos: java.util.stack<e> Métodos: push(obj), pop(), peek(), size(), e empty() Filas Queue<E> e Dequeues Deque<E> A classe Deque é mais geral. Listas ligadas (permitem implementar Filas/Pilhas/Dequeues): java.util.linkedlist<e> Para implementar filas, usar os métodos: addlast(obj) e removefirst(). Esta classe é muito flexível. Estas classes são novas na versão do Java, podendo ser parametrizadas por tipo de dados, por exemplo, posso ter uma stack de inteiros declarando um objecto do tipo Stack<Integer>. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 45 / 49 Problema de Josephus: listas circulares sem vectores Imagine que N pessoas decidem eleger um líder usando um método de eliminações sucessivas, ficando como líder o último a ser eliminado. As N pessoas dispõe-se num círculo e elimina-se a M-ésima pessoa, cerrando fileiras com os restantes. A pessoa a ser eleita depende do N e do M. Para o exemplo seguinte, a pessoa na posição inicial 4 seria a eleita. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 46 / 49

Listas circulares em Java (sem vectores) (1) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 47 / 49 Listas circulares em Java (sem vectores) (2) Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 48 / 49

Classe principal para o problema do Josephus Problemas semelhantes nas aulas: P06. Em Valladolid: 130-133-151-180-305-402-440-10015. Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 49 / 49