Вы находитесь на странице: 1из 25

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

Definio de Lista (1)


Uma lista uma sequncia finita de elementos ligados entre si
Em que,
cada elemento (ou n) da lista tem a seguinte estrutura:
I um atributo com o valor do elemento, e
I um atributo com uma referncia para o prximo elemento da lista (ser
nula se for o ltimo elemento).
a ordem dos elementos na lista relevante.
os elementos de uma lista so todos do mesmo tipo.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 2 / 49


Definio Recursiva de Lista (2)
Uma lista L uma sequncia finita de elementos em que:
L ou uma lista vazia (0 elementos), ou
L uma lista composta por um elemento H (cabea da lista) seguido
de um resto de lista RL com os restantes elementos.

Escrito de outra forma (notao do Prolog):


L= [] (lista vazia)
L= [H|RL] (cabea H, seguida do resto de lista RL)
Verificar se X membro de uma lista L:

member(X,[X|_]). % X ou est na cabea 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

Definio TAD-Lista (3)


Um TAD-lista define-se como uma sequncia de elementos:
onde cada elemento caracterizado por uma estrutura com dois
atributos:
I um valor do elemento corrente (e.g. inteiro, objecto, etc), e
I uma referncia para elemento seguinte.
e um conjunto de operaes a realizar sobre a sequncia:
addFirst(val) inserir val no incio da lista
addLast(val) inserir val no fim da lista
add(val, index) inserir val na posio index
removeFirst() remover o primeiro elemento
remove(index) remover o elemento na posio index
removeLast() remover o ltimo elemento
get(index) retornar o elemento na posio index
indexOf(val) retorna a posio da 1a ocorrncia de val
empty() verificar se a lista est vazia
Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 4 / 49
Definio 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?


comear num elemento da lista (o primeiro)
enquanto no chegar ao fim da lista
escrever o elemento corrente
e avanar para o elemento seguinte

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 6 / 49


Listas Ligadas (class LinkedIntList)

Na definio de lista determinante saber qual o primeiro elemento da


lista.
Uma lista fica caracterizada por uma classe LinkedIntList com
first - referencia 1o elemento (um ListNode).
size - mantm o no de elementos na lista.
e os mtodos 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


Mtodos que percorrem a lista (print())

Escrever os elementos da lista:

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 9 / 49

Mtodos que percorrem a lista: size() e indexOf()


Comprimento da lista: calcular o nmero de elementos na lista.

Procurar a posio na lista da 1a. ocorrncia de v; retornar -1 se v no


existir na lista (podia gerar uma excepo).

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 10 / 49


Inserir um elemento numa lista
Inserir numa lista vazia:

Inserir cabea da lista:

Implementao:

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 11 / 49

Inserir um elemento numa lista

Inserir na posio dada por index (e.g. l.add(5, 2);):

A posio index tem de obdecer a 0 <= index <= size-1, em que


size o nmero de elementos na lista.
Se index==0 ento corresponde a inserir no incio da lista.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 12 / 49


Implementao do mtodo 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:

Implementao:

Notas:
I No estamos a tratar o caso de a lista poder estar vazia.
I No retornamos o elemento devolvido! Deve usar-se o mtodo 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 posio 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 posio index da lista:

Notas:
I Nos vrios mtodos, por simplicidade, no verificamos situaes de
excepo!
I Os mtodos get() e remove() tm de satisfazer 0 index size 1
(o que garante que a lista no est vazia)!
I Os mtodos getFirst() e removeFirst() tm de satisfazer que a
lista no 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 genricos

Em vez de definirmos listas de inteiros podemos ter listas de objectos


genricos, usando Object:

Veremos mais adiante uma definio mais completa, usando tipos


genricos.
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 operaes sobre o TAD-lista do
seguinte modo:
1 apenas podemos adicionar na primeira posio da lista,
2 apenas podemos remover o primeiro elemento da lista.
Estas restries fazem com que uma pilha seja tambm 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) - definio

Um TAD-pilha uma sequncia de elementos, S = [a1 , a2 , . . . , an ], em que


an o elemento mais recente da sequncia (ou elemento do topo da
pilha), juntamente com as operaes:
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 an , o elemento no topo de S (mas no altera S)
4. isEmpty (S) retorna true se S estiver vazio, false caso contrrio.
5. isFull(S) retorna true se S estiver cheio, false caso contrrio.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 20 / 49


Uma interface Pilha (Stack)
A interface define as assinaturas dos mtodos pblicos do TAD-Pilha
(comentrios em Javadoc).

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 21 / 49

Uma interface Pilha (Stack) (2)

Duas implementaes possveis:


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 genricos.

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 sequncia 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 princpio da fila.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 28 / 49


TAD-Fila (Queue) (2)

Um TAD-fila uma sequncia de elementos, F = [a1 , a2 , . . . , an ], em


que a1 o primeiro elemento da fila e an o ltimo, juntamente com
as seguintes operaes (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 posio da fila;
5. peek() retorna o valor do 1o elemento da fila;
2. remove() remove o 1o. elemento da fila e retorna esse valor;
Aplicaes: simulao de filas (bancos, supermercados, atendimento
pblico, etc.), implementao a baixo nvel 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 mtodos pblicos do TAD-Fila, como so


declarados e usados (comentrios 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

Implementao de filas: vector circular (1)

A ideia representar a fila por um vector circular, em que first e


last so cursores do vector que apontam para o incio e fim da fila.
Condies importantes a verificar:
I quando os cursores estiverem na ltima posio do vector, cap-1, e
forem incrementados devem passar para a posio 0;
I verificar se a lista est vazia:
F verificar se size==0, em que size o nmero de elementos na fila,
F ou, a lista est vazia se first==last.
I verificar se a lista est cheia:
F verificar se size==cap, em que size o nmero de elementos na fila e
cap a capacidade do vector.,
F ou, a lista est cheia se ((last+1)%MAX)==first (obriga a deixar uma
posio por usar no vector);

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 32 / 49


Implementao de filas: vector circular (2)

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 33 / 49

Implementao de filas: vector circular (3)

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 34 / 49


Implementao de filas: listas ligadas (1)
A implementao dos mtodos segue de perto a implementao de listas
ligadas.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 35 / 49

Implementao 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 sequncia de elementos em que cada elemento, com excepo do
primeiro e ltimo, contm um valor e referncias para o elemento anterior
e elemento seguinte.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 37 / 49

Implementao 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 genrico. Toda a restante definio ser idntica.

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 38 / 49


Implementao 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 terminao, sendo possvel operaes de insero e
remoo no incio ou fim da fila.

Um TAD-deque pode ser visto como uma sequncia de elementos


duplamente ligados sobre os quais possvel ter as seguintes operaes
(alm das habituais sobre filas):
insertFirst(x) insere x no incio da deque.
insertLast(x) insere x no fim da deque.
removeFirst() remove e retorna primeiro elemento.
removeLast() remove e retorna ltimo elemento.
A implementao 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
Implementao de Dequeues: classe e addLast()

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 41 / 49

Implementao de Dequeues: mtodo removeLast()

Exerccio: Implemente os restantes mtodos de uma dequeue:


addFirst(), removeFirst(), isDequeueEmpty().

Fernando Silva (DCC-FCUP) 4. Listas, Pilhas, e Filas Estruturas de Dados 42 / 49


Implementao de Dequeues: classe exemplo de uso

O programa coloca os nmeros de 10 a 1 no incio da fila, desse modo invertendo


essa sequncia, e coloca no fim da fila os nmeros de 11 a 20. Ao retirarmos um
elemento do incio 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 aproximao?
os vectores so melhores para acesso aleatrio;
listas so melhores para operaes de adio e remoo de elementos;
listas duplamente ligadas para operaes que requeiram movimentos
nas duas direces da lista;
listas evitam as ineficientes operaes 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 genricos: java.util.Stack<E>
Mtodos: 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 mtodos: addLast(obj) e
removeFirst().
Esta classe muito flexvel.
Estas classes so novas na verso 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 lder usando um mtodo de
eliminaes sucessivas, ficando como lder o ltimo a ser eliminado. As N
pessoas dispe-se num crculo 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 posio 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

Вам также может понравиться