Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Sumrio
Pilhas Sequenciais Pilhas Encadeadas Filas Sequenciais Filas Encadeadas Filas Duplas ou Deques Sequenciais Deques Encadeadas
Pilhas e Filas
So listas especializadas por terem caractersticas prprias, mas tambm possuem operaes: inserir e excluir um elemento; encontrar o maior e o menor; contar os elementos, alterar e buscar um elemento, buscar o sucessor e o predecessor. Essas duas estruturas de dados representam conjuntos de dados que esto organizados em ordem linear. Conforme suas caractersticas, podem ser classificadas em quatro tipos: Estticas: a ordem linear determinada pelos ndices dos vetores. p Dinmicas: representadas por elementos encadeados. Homognea: contm apenas um dado primitivo, como um nmero. Heterognea: contm um dado composto, como o nome e o salrio de um funcionrio.
Prof. Eng. D.Sc. Emerson Cordeiro Morais
Pilhas e Filas
Estrutura de dados tipo pilha p p Estrutura de dados tipo fila p
Pilhas e Filas
Excluses LIFO Last In First Out Pilha o ltimo componente inserido o primeiro a ser retirado PILHA FIFO First In First Out Fila o primeiro componente inserido tambm o primeiro a ser retirado Topo Consultas Inseres
FILA
Excluses e Consultas
Incio
Final Inseres
5
Pilhas
uma lista linear em que todas as inseres, retiradas e, geralmente, todos os acessos so feitos em apenas um extremo da lista lista. Os itens so colocados um sobre o outro. O item inserido mais recentemente est no topo e o inserido menos recentemente no fundo. Esta imagem est frequentemente associada com a teoria de autmato, na qual o topo de uma pilha considerado como o receptculo de uma cabea de leitura/gravao que pode empilhar e desempilhar itens da pilha. ilh Propriedade: o ltimo item inserido o primeiro item que pode ser retirado da lista. So chamadas listas lifo (last-in, first-out).
Pilhas
Existe uma ordem linear para pilhas, do mais recente para o menos recente. Uma pilha contm uma seqncia de obrigaes adiadas. A ordem de remoo garante que as estruturas mais internas sero processadas antes das mais externas. Aplicaes em estruturas aninhadas:
Quando necessrio caminhar em um conjunto de dados e guardar uma lista de coisas a fazer posteriormente. p O controle de seqncias de chamadas de subprogramas. A sintaxe de expresses aritmticas.
As pilhas ocorrem em estruturas de natureza recursiva (como rvores). Elas so utilizadas para implementar a recursividade.
Prof. Eng. D.Sc. Emerson Cordeiro Morais
TAD Pilhas
O conjunto de operaes mais usual: inserir na pilha; consultar toda a pilha; Remover da pilha; e esvazi-la. Qualquer estrutura desse tipo possui um ponteiro denominado topo, no qual todas as operaes de insero e remoo acontecem. Assim, as operaes ocorrem sempre na mesma extremidade. Existem vrias opes de estruturas de dados que podem ser usadas para representar pilhas. As duas representaes mais utilizadas so as implementaes por meio de vetores e de apontadores.
Prof. Eng. D.Sc. Emerson Cordeiro Morais
Pilhas Sequenciais
Os itens da pilha so armazenados em posies contguas de memria. Como as inseres e as retiradas ocorrem no topo da pilha, um cursor pilha chamado Topo utilizado para controlar a posio do item no topo da pilha. Lim
Topo
ndices do arranjo
Pilha
9
Pilhas Sequenciais
1. Inicializar pilha de valores inteiros, com 10 ns; 2. 2 Inserir nodo com valor 3; 3. Inserir nodo com valor 7; 4. Inserir nodo com valor 5; e 5. Remover nodo do topo.
LIM
9 8 7 6 5 4 3 2 1 0 PILHA
LIM
9 8 7 6 5 4 3 2
LIM
9 8 7 6 5 4 3
LIM
9 8 7 6 5 4
LIM
9 8 7 6 5 4 3
TOPO
TOPO
TOPO
TOPO
1 0
7 3
PILHA
1 0
5 7 3
PILHA
2 1 0
TOPO
7 3
1 0
PILHA
PILHA
10
Classe PilhaSequencial
Conjunto de Operaes:
1. 1 PilhaSequencial() Inicializa a pilha vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a pilha estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no topo da pilha. 4. int Tamanho() Retorna o tamanho atual da pilha. 5. void Imprime() Imprime todos os itens da pilha. 6. void Retira() Retira o item no topo da pilha. 7. void Esvazia() Esvazia a pilha e a deixa como na inicializao. 8. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.
11
Classe PilhaSequencial
package cap3.pilhasequencial; public class PilhaSequencial { final int maxtam = 100; //tamanho mximo da pilha private int pilha[]; private int topo; //Operaes public PilhaSequencial () { this.pilha = new int[maxtam]; //cria uma pilha com n posies this.topo = 0; } public boolean EstaVazia () { return (this.topo == 0); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
12
Topo
9 8 7 6 5 4 3 2 1 0
Pilha
Topo
9 8 7 6 5 4 3 2 1 0
Pilha
13
14
Remoo de um Item
Lim
Topo
9 8 7 6 5 4 3 2 1 0
Pilha
Operao POP
Lim
Topo
9 8 7 6 5 4 3 2 1 0
Pilha
15
16
17
Pilhas Encadeadas
Cada clula de uma pilha contm um item da pilha e um apontador para outra clula.
Info Elo Topo da pilha
Base da pilha
Prof. Eng. D.Sc. Emerson Cordeiro Morais
18
Classe PilhaEncadeada
Conjunto de Operaes:
1. 1 PilhaEncadeada() Inicializa a pilha vazia vazia. 2. boolean EstaVazia() Retorna true se a pilha estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no topo da pilha. 4. int Tamanho() Retorna o tamanho atual da pilha. 5. void Imprime() Imprime todos os itens da pilha. 6. void Retira() Retira o item no topo da pilha. 7. void Esvazia() Esvazia a pilha e a deixa como na inicializao. 8. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.
19
Classe PilhaEncadeada
package cap3.pilhaencadeada; public class PilhaEncadeada { private static class Celula { int i t num; Celula prox; } private Celula topo; private int tam; //Operaes public PilhaEncadeada () { this.topo = null; this.tam = 0; } public boolean EstaVazia () { return (this.topo == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
20
10
21
22
11
Remoo de um Item
Nodo a ser removido
Topo Topo
23
24
12
25
Anlise da Complexidade
A ao de insero e remoo sempre realiza operaes bsicas para atualizar o topo da pilha So operaes de tempo constante e gastam pilha. O(1). A operao de consultar toda a pilha percorre os elementos armazenados. Uma pilha contm n elementos, logo o tempo de execuo O(n). A operao de esvaziamento da pilha remove todos os elementos. O tempo gasto depende da linguagem de programao utilizada Java utilizada. possui coleta de lixo automtica.
26
13
Filas
uma lista linear em que todas as inseres so realizadas em um extremo da lista e todas as retiradas e geralmente os acessos so lista, e, geralmente, realizados no outro extremo da lista. So chamadas listas fifo (first-in, first-out). Existe uma ordem linear para filas que a ordem de chegada. So utilizadas quando desejamos processar itens de acordo com a ordem primeiro-que-chega, primeiro-atendido. Sistemas operacionais utilizam filas para regular a ordem na qual tarefas devem receber processamento e recursos devem ser alocados a processos.
27
TAD Filas
O conjunto de operaes mais usual: inserir na fila; consultar toda a fila; remover da fila; e esvazi-la. Essa estrutura possui um ponteiro INCIO (remoes) e um FIM (inseres). As operaes ocorrem nas duas extremidades da estrutura.
Incio Final Inseres Excluses e Consultas
Prof. Eng. D.Sc. Emerson Cordeiro Morais
28
14
Filas Sequenciais
Os itens so armazenados em posies contguas de memria. A operao Enfileira ou Insere faz a parte de trs da fila expandir se expandir-se. A operao Desenfileira ou Retira faz a parte da frente da fila contrairse. A fila tende a caminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parte da frente. Com poucas inseres e retiradas, a fila vai ao encontro do limite do espao da memria alocado para ela. Soluo: imaginar o vetor como um crculo. A primeira posio segue a ltima.
29
Filas Sequenciais
A fila se encontra em posies contguas de memria, em alguma posio do crculo delimitada pelos apontadores Incio (ou Frente) e crculo, Fim (ou Trs). Para enfileirar, basta mover o apontador Fim uma posio no sentido horrio. Para desenfileirar, basta mover o apontador Incio uma posio no sentido horrio.
30
15
Filas Sequenciais
Problemas na implementao circular de filas: Nos casos de fila cheia e fila vazia os apontadores Frente e Trs vazia, apontam para a mesma posio do crculo. Uma sada para distinguir as duas situaes deixar uma posio vazia no vetor. Nesse caso, a fila est cheia quando Trs+1 for igual a Frente. A implementao utiliza aritmtica modular nos procedimentos Insere e Retira (% do Java).
31
Filas Sequenciais
IF=FF 0 1 2 3 4 5
Evoluo da Fila
FILA IF 0 FF 1 2 3 4 5
1. 2. 3. 4. 5.
Inicializar a fila Inserir um novo nodo com valor 3 Inserir um novo nodo com valor 7 Inserir um novo nodo com valor 5 Remover um nodo
FILA
3
IF 0 1 FF 2 3 4 5
FILA
3
IF 0
7
1 2 FF 3 4 5
FILA
3
0
7
IF 1
5
2 FF 3 4 5
FILA
Prof. Eng. D.Sc. Emerson Cordeiro Morais
5
32
16
Filas Sequenciais
IF
0 1 2 3 4 5 6
FF
7 8 9 10 11 12
FILA IF
0 1 2 3 4 5 6 7 8
FF
9 10 11 12
FILA IF
0 1 2 3 4 5 6 7 8 9 10 11
FF
12
FILA FF
0 1 2 3 4
IF
5 6 7 8 9 10 11 12
FILA FF
0 1 2 3 4
IF
5 6 7 8 9 10 11 12
33
FILA CHEIA
Prof. Eng. D.Sc. Emerson Cordeiro Morais
Classe FilaSequencial
Conjunto de Operaes:
1. 1 FilaSequencial() Inicializa a fila vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a fila estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no final da fila. 4. int Tamanho() Retorna o tamanho atual da fila. 5. void Imprime() Imprime todos os itens da fila. 6. void Retira() Retira o item no incio da fila. 7. void Esvazia() Esvazia a fila e a deixa como na inicializao. 8. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.
34
17
Classe FilaSequencial
package cap3.filasequencial; public class FilaSequencial { ; // g p p final int maxtam = 100; //tamanho igual a maxtam-1 para resolver o problema circular private int fila[]; private int inicio,fim; private int tam; //Operaes public FilaSequencial () { this.fila = new int[maxtam]; //cria uma fila com n posies this.inicio = 0; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == this.fim); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
35
IF
FF
... ...
atrs
FF IF
na frente
FF
IF
...
no meio
36
18
37
Remoo de um Item
Nodo removido sempre o do incio da fila
Nodo que pode ser removido
IF
0 1 2 3 4 5 6 7 8 9 10
FF
11 12
FILA
IF
0 1 2 3 4 5 6 7 8 9 10
FF
11 12
FILA
38
19
39
40
20
Filas Encadeadas
Cada clula de uma fila contm um item da fila e um apontador para outra clula. clula
Info F1 F2
Elo F3 Fn
Para acessar o ltimo nodo, necessrio percorrer toda a fila a partir do primeiro nodo
41
Classe FilaEncadeada
Conjunto de Operaes:
1. 1 FilaEncadeada() Inicializa a fila vazia vazia. 2. boolean EstaVazia() Retorna true se a fila estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no final da fila. 4. int Tamanho() Retorna o tamanho atual da fila. 5. void Imprime() Imprime todos os itens da fila. 6. void Retira() Retira o item no incio da fila. 7. void Esvazia() Esvazia a fila e a deixa como na inicializao. 8. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.
42
21
Classe FilaEncadeada
package cap3.filaencadeada; public class FilaEncadeada { private static class Celula { int i t num; Celula prox; } private Celula inicio,fim; private int tam; //Operaes public FilaEncadeada () { this.inicio = null; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
43
Incio
Incio
44
22
Remoo de um Item
Final Final
46
23
Remoo de um Item
public void Retira (){ if (this.EstaVazia ()) { System.out.println ("A fila est vazia!"); } else { // A fila contm elementos e o primeiro elemento inserido ser removido System.out.println("\n"+this.inicio.num+" RETIRADO DA FILA!"); this.inicio = this.inicio.prox; this.tam--; } // fim do else } // fim do mtodo
47
Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ( A System out println ("A fila est vazia!"); vazia! ); } else{ System.out.println ("Impresso da Fila \n"); Celula aux = this.inicio; while (aux != null) { System.out.print (aux.num + " "); aux = aux.prox; } } } public int Tamanho () { return this.tam; }
48
24
49
Anlise da Complexidade
A insero na fila sempre realiza operaes bsicas, para atualizar o FIM da fila O mesmo ocorre no caso da remoo para atualizar o fila. INCIO. So operaes de tempo constante e gastam tempo O(1). A operao de consultar toda a fila percorre todos os elementos armazenados. Uma fila contm n elementos, logo o tempo de execuo ser O(n). A operao de esvaziamento da fila consiste em remover todos os seus elementos. elementos O tempo gasto depende da linguagem de programao utilizada. Java possui coleta de lixo automtica..
50
25
51
TAD Deque
O conjunto de operaes mais usual: inserir no incio da deque; inserir no final da deque; Final Incio consultar toda a deque; Consultas Consultas remover no incio da deque; remover no final da deque; e esvazi-la. Essa estrutura possui um ponteiro INCIO (inseres e remoes) e um FIM (inseres e remoes). Ambas as operaes ocorrem nas duas extremidades da estrutura.
52
26
Deques Sequenciais
Os itens so armazenados em posies contguas de memria. As operaes insere no incio ou no fim faz a deque expandir-se. p q p As operaes retira no incio ou no fim faz a deque contrair-se. A deque tende a caminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parte da frente. Com poucas inseres e retiradas, a deque vai ao encontro do limite do espao da memria alocado para ela. Deve-se adotar a mesmo soluo d fil D d t l das filas, i t i l isto , implementar uma t deque circular.
ID
0 1 2 3 4 5 6
FD
7 8 9 10 11 12
Deque
Prof. Eng. D.Sc. Emerson Cordeiro Morais
53
Classe DequeSequencial
Conjunto de Operaes:
1. 1 DequeSequencial() Inicializa a deque vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a deque estiver vazia ou false, caso contrrio. 3. void InsereInicio(int dado) Insere dado no inicio da deque. 4. void InsereFinal(int dado) Insere dado no final da deque. 5. int Tamanho() Retorna o tamanho atual da deque. 6. void Imprime() Imprime todos os itens da deque. 7. void RetiraInicio() Retira o item no incio da deque. 8. void RetiraFinal() Retira o item no final da deque. 9. void Esvazia() Esvazia a deque e a deixa como na inicializao. 10. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.
Prof. Eng. D.Sc. Emerson Cordeiro Morais
54
27
Classe DequeSequencial
package cap3.dequesequencial; public class DequeSequencial { final int maxtam = 100; //tamanho igual a maxtam-1 para resolver o problema circular private int deque[]; private int inicio,fim; private int tam; //Operaes public DequeSequencial () { this.deque = new int[maxtam]; //cria uma deque com n posies this.inicio = 0; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == this.fim); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
55
FD
9 10 11 12
DEQUE ID
0 1 2 3 4 5 6 7 8
FD
9 10 11 12
FD
8 9 10 11 12
DEQUE FD
0 1 2 3 4 5 6 7 8 9 10 11
ID
12
DEQUE
Prof. Eng. D.Sc. Emerson Cordeiro Morais
56
28
57
58
29
FD
7 8 9 10 11 12
DEQUE ID
0 1 2 3 4 5 6 7
FD
8 9 10 11 12
ID
8 9 10 11 12
DEQUE FD
0 1 2 3 4 5 6 7
ID
8 9 10 11 12
DEQUE
Prof. Eng. D.Sc. Emerson Cordeiro Morais
59
60
30
Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ("A deque est vazia!"); } else{ System.out.println ("Impresso da Deque \n"); for (int i = this.inicio; i != this.fim; i = (i + 1) % this.deque.length){ System.out.print (this.deque[i] + " "); } } } public int Tamanho () { return this.tam; }
61
62
31
Deques Encadeados
Cada clula de uma deque contm um item da deque e um apontador para outra clula. clula
Info D1 D2
Elo D3 Dn
Para acessar o ltimo nodo, necessrio percorrer toda a deque a partir do primeiro nodo
Prof. Eng. D.Sc. Emerson Cordeiro Morais
63
Classe DequeEncadeado
Conjunto de Operaes:
1. 1 DequeEncadeada() Inicializa a deque vazia vazia. 2. boolean EstaVazia() Retorna true se a deque estiver vazia ou false, caso contrrio. 3. void InsereInicio(int dado) Insere dado no inicio da deque. 4. void InsereFinal(int dado) Insere dado no final da deque. 5. int Tamanho() Retorna o tamanho atual da deque. 6. void Imprime() Imprime todos os itens da deque. 7. void RetiraInicio() Retira o item no incio da deque. 8. void RetiraFinal() Retira o item no final da deque. 9. void Esvazia() Esvazia a deque e a deixa como na inicializao. 10. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.
Prof. Eng. D.Sc. Emerson Cordeiro Morais
64
32
Classe DequeEncadeado
package cap3.dequeencadeada; public class DequeEncadeada { private static class Celula { int num; Celula prox; } private Celula inicio,fim; private int tam; //Operaes public DequeEncadeada () { this.inicio = null; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
65
66
33
67
34
Final
Incio
Incio
Prof. Eng. D.Sc. Emerson Cordeiro Morais
69
70
35
71
Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ("A deque est vazia!"); } else{ System.out.println ("Impresso da Deque \n"); Celula aux = this.inicio; while (aux != null) { System.out.print (aux.num + " "); aux = aux.prox; } } } public int Tamanho () { return this.tam; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais
72
36
73
37