Escolar Documentos
Profissional Documentos
Cultura Documentos
Pilhas
E N T E N D A O F U N C I O N A M E N TO D A S P R I N C IPA IS
E S T R U T U R A S D E D A D O S L I N E A R E S U T IL I Z A D A S N O S
S IS T E MA S C O M P U TA C I O N A I S E A S S U A S A P L I C A Ç Õ E S
Agenda
Introdução
Listas
Filas
Pilhas
Encadeamento
Conclusão
AVISO!
A partir desse módulo, parte-se da premissa
que o aluno possui TOTAL domínio em TAD,
Matrizes, Referências e Recursividade.
Caso esteja com dúvidas acerca de um
desses tópicos, revise-os IMEDIATAMENTE!
O professor está a sua disposição para ajudá-
lo no que for preciso.
Referências para Estudo
introdução
PORQUE...
Relembrar é VIVER!
Estruturas de Dados
Estruturas de Dados são formas genéricas de organizar os dados
envolvidos na solução de um problema, possibilitando a consulta e
manipulação eficiente de dados.
◦ Exemplos: Banco de Dados, Ranking, Árvores Genealógicas.
Listas
APRENDA A TRABALHAR COM ESTRUTURAS
DE DADOS LINEARES
Como você realiza as compras
em um supermercado?
Compras no Supermercado
VAI COMPRAR É AS
COISAS PRA CASA,
SEU CABA
SENREGONHA!É hoje que eu compro
as minhas cevas!
Tomate Queijo
Carne Leite
Melão Margarina
Cheiro Verde Presunto
Mamão Cajuína
Pão Fralda
O que pode-se extrair desse
exemplo?
Reflexão A partir do cenário proposto, é possível
extrair algumas características importantes:
◦ Todos os elementos possuem a mesma
importância;
◦ A adição de itens na lista não segue ordem
alguma;
◦ De forma semelhante, a remoção também
não segue regra alguma.
x1 xn
(header) x2 x3 x...i-1 ...
xi x...i+1 ... (trailer)
5 4 7 9 1 8 6 2
Quais são as operações básicas que
caracterizam uma lista?
Operações Básicas
Uma listas básica possuem as seguintes operações:
◦ Criar uma nova lista – Lista()
◦ Retornar a quantidade de elementos – getQuantidade()
◦ Verificar se a lista está vazia – estaVazia()
◦ Verificar se a lista está cheia, caso possua um limite – estaCheia()
◦ Acessar o elemento na posição i – retornarElemento(i)
◦ Inserir um elemento e na posição i – adicionarPosicao(e, i)
◦ Inserir um elemento e no início – adicionarInicio(e)
◦ Inserir um elemento e no final – adicionarFinal(e)
◦ Remover o elemento e na posição i – removerPosicao(i)
◦ Remover o elemento no inicio – removerInicio()
◦ Remover o elemento no final – removerFinal()
Operações Básicas (cont.)
Dados da Lista:
• 7
Quantidade: 8
• Primeiro Elemento: 5
X
• 2
Último Elemento: 9
5 4 7 9
1 1
8 8
6 6
2 29
8 9
OPERAÇÃO: Remover elemento
Inserir o elemento 89 (oito)
o elemento (nove) no6ªfinal
da 4ªna
posição
posição
Operações Básicas (cont.)
A partir dessas operações básicas,
é possível definir outras operações
mais específicas, como:
◦ Verificar se um elemento está na
lista e qual a sua posição;
◦ Comparar, dividir, combinar ou
inverter listas;
◦ Realizar operações em volume com
os elementos;
◦ Ordenar os elementos da lista.
Mas como implementar uma lista e
suas operações?
Implementação
Os elementos de uma lista estão dispostos na forma linear.
◦ Ou seja, os elementos desse conjunto são consecutivos, vizinhos;
Implementação (cont.)
REMOVER_POSICAO(i) {
Caso a posição informada seja
no início ou no final da lista, os
se LISTA_VAZIA() respectivos métodos são
erro “Estrutura vazia!” invocados.
senão
se i <= 0
Nos demais casos, o elemento
retorne REMOVER_INICIO()
inserido é copiado e os
senão se i >= numero_elementos
elementos POSTERIORES à
retorne REMOVER_FINAL()
posição desejada são
senão
EMPURRADOS para a
elemento_removido vetor_elementos[i]
esquerda.
para indice de i a numero_elementos - 1 faça
vetor_elementos[indice]
vetor_elementos[indice + 1]
fim-para
numero_elementos numero_elementos – 1
retorne elemento_removido
fim-se
fim-se
}
fim-classe Lista
Eureka! Conseguimos!
O que acontece com os valores do vetor
na memória após a remoção de um
elemento?
DEVER DE CASA
Implementar a estrutura de dados lista
utilizando as linguagens de programação
Java e C++.
◦ Recomenda-se a escrita inicial da lógica central
da estrutura apresentada.
◦ Após a compreensão do código escrito,
adicionar os recursos avançados da linguagem.
◦ Lembre-se de validar a sua estrutura através
da montagem de exemplos que manipulam
essas estruturas.
Recursos Avançados
É possível aplicar diversos fundamentos e recursos da programação
orientada a objetos no desenvolvimento das listas.
◦ Interfaces possibilitam a definição dos métodos obrigatórios da lista,
qualquer que seja o seu tipo (sequencial ou encadeada);
◦ O encapsulamento garante a correta visibilidade das propriedades (atributos
e métodos) da lista;
◦ O tratamento de exceções permite personalizar a experiência do usuário com
o programa e o tratamento de eventos especiais das listas (lista cheia ou
vazia, posições inválidas, etc.);
◦ O uso de tipos genéricos possibilita a geração de estruturas de dados
voltadas para o armazenamento e manipulação de diferentes tipos de dados
(primitivos ou abstratos).
FUNDAÇÃO EDSON QUEIROZ
UNIVERSIDADE DE FORTALEZA
ENSINANDO E APRENDENDO
IMPLEMENTAÇÃO DE LISTAS
DEMONSTRAÇÃO
Casos Especiais
Em muitos cenários, é útil impor determinadas restrições quanto a
manipulação de certas estruturas de dados.
◦ Essas limitações afetam a visibilidade e as operações disponibilizadas pela
estrutura;
◦ Ajuda na modelagem computacional de certos processos que ocorrem no
mundo real.
Filas
ENTENDA OS FUNDAMENTOS ENVOLVIDOS
NA REPRESENTAÇÃO DESSA
ESPECIALIZAÇÃO DE LISTAS
Como funciona um
atendimento bancário?
Atendimento Bancário
SENHA
20
O que pode-se extrair desse
exemplo?
Reflexão A partir do cenário proposto, é possível
extrair algumas características importantes:
◦ Todos os elementos possuem a mesma
importância;
◦ A adição de itens sempre ocorre no final do
conjunto;
◦ A remoção de elementos sempre ocorre no
início do conjunto.
X
5
8 8
7 7
3 3
OPERAÇÃO:
OPERAÇÃO: Inserir
Remover o elemento
elemento3
7
5
8
Mas como implementar uma fila e
suas operações?
Implementação
Assim como as listas, as filas
suportam a alocação sequencial
de seus elementos na forma de
um vetor.
◦ Garantindo o alinhamento das
ordens lógica e física dos
elementos desse conjunto.
IMPLEMENTAÇÃO DE FILAS
DEMONSTRAÇÃO
FUNDAÇÃO EDSON QUEIROZ
UNIVERSIDADE DE FORTALEZA
ENSINANDO E APRENDENDO
Pilhas
ENTENDA OS FUNDAMENTOS ENVOLVIDOS
NA REPRESENTAÇÃO DESSA
ESPECIALIZAÇÃO DE LISTAS
Como funciona um setor de
estoque e armazenamento de
produtos?
Setor de Estoque
TU É DOIDO, MAH!
NUM ISQUECE DE
IMPLILHAR DAS
AH, MAH! Esqueci
CAIXAS! Acabou o expediente!
que a caixa vermelha
Hora de ir pra casa!
é noutro lugar!
O que pode-se extrair desse
exemplo?
Reflexão A partir do cenário proposto, é possível
extrair algumas características importantes:
◦ Todos os elementos possuem a mesma
importância;
◦ A adição e remoção de itens sempre ocorre
no topo do conjunto.
3
7
5
PILHA
Mas como implementar uma pilha e
suas operações?
Implementação
Assim como as listas, as pilhas
suportam a alocação sequencial
de seus elementos na forma de
um vetor.
◦ Garantindo o alinhamento das
ordens lógica e física dos
elementos desse conjunto.
IMPLEMENTAÇÃO DE PILHAS
DEMONSTRAÇÃO
FUNDAÇÃO EDSON QUEIROZ
UNIVERSIDADE DE FORTALEZA
ENSINANDO E APRENDENDO
Encadeamento
APRENDA A TRABALHAR COM O RECURSO
DE ENCADEAMENTO PARA REPRESENTAR
ESTRUTURAS LINEARES
Quais as desvantagens em trabalhar
com a alocação sequencial?
Limitações da Alocação
Sequencial
A alocação sequencial possui as seguintes
desvantagens:
◦ O espaço ocupado pelo vetor para armazenar
os elementos da estrutura permanece
reservado na memória, mesmo quando a lista
não ocupa todo o espaço desse vetor;
◦ Além disso, não é possível armazenar mais
elementos do que a quantia máxima definida
ao criar o vetor, gerando o erro do estouro.
Qual seria a outra abordagem para
definir e manipular estruturas
lineares?
Alocação Encadeada
Para resolver esses problemas, foi desenvolvida a técnica da alocação
encadeada.
◦ Na alocação encadeada, cada elemento é inserido dentro de um TAD
chamado nó, o qual funciona como um container;
◦ Nessa técnica, os nós que compõem a estrutura estão espalhados na
memória, mas ligados através de referências contidas em cada um desses
elementos;
◦ Cada nó armazena, além do elemento, as referências que ligam esse objeto a
outros nós;
◦ Em outras palavras, a posição relativa dos nós na memória não corresponde
à sua posição lógica na estrutura.
Alocação Encadeada (cont.)
Estruturas de dados baseadas na alocação encadeada possuem os
seguintes benefícios:
◦ As diversas operações relativas a manipulação dos nós na estrutura, como
inserções e remoções, resumem-se a manipulação de referências;
◦ Ao manipular referências, não há movimentação dos elementos na memória,
aumentando o desempenho dessas operações;
◦ A alocação de memória para armazenamento os elementos na estrutura é
gradual, permitindo um crescimento praticamente indefinido da estrutura.
Como a alocação encadeada
possibilita a implementação de uma
lista?
Lista Encadeada
Em uma lista encadeada, os nós que armazenam os elementos
encontram-se aleatoriamente dispostos na memória, sendo interligados
através das referências.
◦ Cada referência indica a posição de um nó na memória.
5 8 7 10 2 3
INÍCIO
5 8
X 7 10 2 3
14
Como seria a operação de remoção
de um elemento na lista encadeada?
Lista Encadeada (cont.)
INÍCIO
5 8 7
X X
10 2 3
Mas e quem removerá o nó
“excluído” da memória?
Mas afinal, isso é
implementável? Ou seria
mágica? Ou seria mistério?
IMPORTANTE!
Os algoritmos envolvidos na construção de
uma lista estão representados na forma de
pseudocódigos.
◦ Essa forma simplifica a compreensão da
lógica central dos algoritmos por parte do
aluno.
◦ Recursos específicos das linguagens de
programação, como visibilidade, tratamento
de exceções e interfaces não estão
presentes.
CONSTRUTOR(e) {
O construtor recebe o
elemento_armazenado e ELEMENTO a ser armazenado e
proximo NULO inicializa a referência como
} NULO.
fim-classe Nó
Para representar uma lista
encadeada, um único atributo é
necessário: uma REFERÊNCIA
classe Lista
O construtor apenas inicializa a
lista vazia, informando que o
inicio_lista início da lista aponta para
NULO.
CONSTRUTOR() {
inicio_lista NULO
Esse método verifica se a lista
}
encontra-se sem elementos,
retornando VERDADEIRO caso
LISTA_VAZIA() { não existam elementos
inseridos.
se inicio_lista == NULO
retorne VERDADEIRO
senão
retorne FALSO
fim-se
}
A inserção de um elemento no
início de uma lista encadeada
consiste na criação de um
NOVO NÓ. Após a criação desse
Implementação (cont.)
ADICIONAR_INICIO(e) {
contêiner, ele apontará para o
INÍCIO ATUAL da lista caso a
mesma não esteja vazia. Em
novo recebe um novo nó, inicializado com o valor e
se !LISTA_VAZIA() seguida, esse novo nó se torna
novo.proximo_no inicio_lista o NOVO INÍCIO da estrutura,
fim-se independente da lista estar
inicio_lista novo
vazia ou não.
}
ADICIONAR_FINAL(e) {
novo recebe um novo nó, inicializado com o valor e
A inserção de um elemento no
se LISTA_VAZIA()
final de uma lista encadeada
consiste na criação de um
inicio_lista novo
NOVO NÓ. Após a criação
senão
desse contêiner, um NÓ
auxiliar inicio_lista
AUXILIAR é criado, para que o
enquanto auxiliar.proximo_no != NULO faça
código possa percorrer toda a
auxiliar auxiliar.proximo_no
estrutura até chegar ao último
fim-enquanto
elemento (aquele cujo o
auxiliar.proximo_no novo próximo nó é NULO). Em
seguida, o PRÓXIMO NÓ do
fim-se auxiliar será o novo nó criado.
}
A remoção ao início da lista
consiste na alteração da
REFERÊNCIA do início da lista
Implementação (cont.)
REMOVER_INICIO() {
removido NULO
para o SEGUNDO ELEMENTO (o
próximo nó a partir do início da
lista, representado pelo nó
se LISTA_VAZIA() AUXILIAR) e o retorno do
erro “Estrutura vazia!”
primeiro elemento.
senão
removido inicio_lista
inicio_lista inicio_lista.proximo_no
fim-se
A remoção ao final da lista
retorne removido consiste na alteração da
} REFERÊNCIA do próximo nó do
REMOVER_FINAL() { PENÚLTIMO ELEMENTO
removido NULO (representado pelo nó
se LISTA_VAZIA() AUXILIAR) para NULO e o
erro “Estrutura vazia!” retorno do último elemento da
senão
lista.
removido auxiliar inicio_lista
enquanto removido.proximo_no != NULO faça
auxiliar removido
removido removido.proximo_no
fim-enquanto
auxiliar.proximo_no NULO
fim-se
retorne removido
}
A adição em uma posição
específica aproveita-se dos
métodos já implementados.
Implementação (cont.)
REMOVER_POSICAO(i) {
Caso a posição informada seja
no início ou no final da lista, os
removido NULO respectivos métodos são
se LISTA_VAZIA() ou i <= 1 invocados.
removido REMOVER_INICIO()
senão
removido auxiliar inicio_lista
indice 1
enquanto indice < i e removido != NULO faça
auxiliar removido
removido removido.proximo_no
indice indice + 1 Nos demais casos, é realizada
fim-enquanto uma varredura até o código
se removido == NULO atingir o elemento a ser
removido REMOVER_FINAL() REMOVIDO e o elemento
senão ANTERIOR à posição desejada
auxiliar.proximo_no removido.proximo_no (representado pelo nó
fim-se AUXILIAR). Em seguida, o
fim-se próximo do nó auxiliar
retorne removido referenciará o próximo nó do
} nó removido. A ORDEM das
fim-classe Lista operações é ESSENCIAL.
Filas e Pilhas Encadeadas
IMPLEMENTAÇÃO DE LISTAS
ENCADEADAS
DEMONSTRAÇÃO
Qual a dificuldade de se trabalhar com listas
encadeadas com referência apenas para o próximo?
EncadeamentoAtéSimples
agora, os nós utilizados nas estruturas
de dados encadeamento armazenam
referenciam apenas o próximo elemento.
◦ Conhecido como Encadeamento Simples.
5 8 7 10 2 3
Mas para qual elemento o início da
lista irá apontar, uma vez que é
circular?
Lista Circular
Uma (cont.)
convenção adotada pelos desenvolvedores é
apontar o início da lista para o último elemento
inserido.
◦ Assim, obtém-se o acesso direto ao último e ao
primeiro elementos da lista.
NULL NULL
5 8 7 10 2 3
IMPLEMENTAÇÃO DE LISTAS
DUPLAMENTE ENCADEADAS
DEMONSTRAÇÃO
FUNDAÇÃO EDSON QUEIROZ
UNIVERSIDADE DE FORTALEZA
ENSINANDO E APRENDENDO
conclusão
RESUMO DOS TÓPICOS APRESENTADOS E
LINKS COMPLEMENTARES
Resumo
Introdução
Listas
Filas
Pilhas
Encadeamento
Conclusão
Obrigado!