pilhas e filas
DESCRIPTION
Pilhas e Filas Programação C/c++ C c++TRANSCRIPT
Estruturas de Dados 1
Pilhas e filas
Estudo de listas lineares especiais, com disciplina restrita
de organização e de acesso a seus nodos
Estruturas de Dados 2
Pilhas e filas
Disciplina restrita
acesso permitido somente em alguns
nodos
Com disciplina restrita de organização e
acesso a seus nodos
Listas lineares especiais
Estruturas de Dados 3
Pilha
Listas lineares especiais mais usuais
Pilhas e filas
Fila
LIFO Last In First Out
o último componente inserido
é o primeiro a ser retirado
FIFO First In First Out
o primeiro componente inserido
é também o primeiro a ser retirado
Estruturas de Dados 4
Pilhas e Filas Consultas
Exclusões Inserções
Topo
Base
Início FinalInserções
Exclusõese
Consultas
PILHA
FILA
Estruturas de Dados 5
Filas Duplas
Inserções e exclusões podem ocorrer em qualquer extremidade da lista
• Especialização de fila
exclusões
inserções exclusões
inserções
Estruturas de Dados 6
Pilhas e filas
Pilhas
Estruturas de Dados 7
Consultas
Exclusões Inserções
Topo
Base
• Criar uma pilha vazia
• Inserir um nodo no topo da pilha
• Remover o nodo do topo de pilha
• Consultar / modificar nodo do topo da pilha
• Destruir a pilha
Operações sobre Pilhas
Pilhas
Estruturas de Dados 8
Pilhas
Pilhas implementadas por contiguidade física
Estruturas de Dados 9
Pilha - contiguidade física Lim
Topo
Base
Pilha
Índicesdo arranjo
Pilha – contiguidade física
• Implementada sobre um arranjo
• Índices de controle da pilha:
• BASE da pilha
• TOPO atual da pilha
• LIMITE máximo que pode ser ocupado pela pilha
Estruturas de Dados 10
Exemplo de manipulação de uma pilha
Retorna “7”
1. Inicializar pilha de valores inteiros, a partir do índice 1, máximo 10 nós
2. Inserir nodo com valor 3
3. Inserir nodo com valor 7
4. Inserir nodo com valor 5
5. Remover nodo do topo
6. Consultar pilha
Pilha – contiguidade física
LIM
TOPO
BASE
PILHA
10
9
8
7
6
5
4
3
2
13
LIM
TOPOBASE
10
9
8
7
6
5
4
3
2
137
LIM
TOPOBASE
10
9
8
7
6
5
4
3
2
1375
LIM
TOPO
BASE
10
9
8
7
6
5
4
3
2
137
LIM
TOPOBASE
10
9
8
7
6
5
4
3
2
1
PILHA PILHA PILHA PILHA
Estruturas de Dados 11
Pilha – contiguidade física
TipoPilha = arranjo [1..N] de TipoNodo
Operações
Tipo de dados utilizado nos algoritmos para pilha implementada
por contiguidade física:
• Criar uma pilha vazia
• Inserir um nodo no topo da pilha
• Remover o nodo do topo de pilha
• Consultar / modificar nodo do topo da pilha
Estruturas de Dados 12
1. Definir valor do índice de BASE da pilha
2. Definir valor máximo de nodos que a pilha pode ter LIM
3. Indicar que a pilha está vazia através do valor de TOPO
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Exemplo:
Base ← 1Topo ← Base – 1Lim ← 6
Criação da pilha
Pilha – contiguidade física
Estruturas de Dados 13
Algoritmo 4.1 - InicializarPilhaArr Entrada: Base (inteiro) Saída: Topo (inteiro)início Topo ← Base – 1fim
Algoritmo: Algoritmo: Inicializar Pilhas implementada sobre Arranjo
Pilha – contiguidade física
Estruturas de Dados 14
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Operação PUSH
Inserção de um nodo na pilhaPilha – contiguidade física
Estruturas de Dados 15
Pilha – contiguidade física
Algoritmo: Algoritmo: Inicializar Pilhas implementada sobre Arranjo
Algoritmo 4.2 - InserirPilhaArr Entradas: Pilha (TipoPilha) Lim (inteiro) Topo (inteiro) Valor (TipoNodo) Saídas: Pilha (TipoPilha) Topo (inteiro) Sucesso (lógico)início se Topo < Lim então início Topo ← Topo + 1 Pilha[Topo] ← Valor Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 16
Pilha – contiguidade física
Remoção de um nodo da pilhaRemoção de um nodo da pilha
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Operação POP
Estruturas de Dados 17
Algoritmo 4.3 - RemoverPilhaArr Entradas: Pilha (TipoPilha) Topo (inteiro) Base (inteiro) Saídas: Pilha (TipoPilha) Topo (inteiro) Sucesso (lógico) ValorRemovido (TipoNodo)início se Topo ≥ Base então início ValorRemovido ← Pilha[Topo] Topo ← Topo - 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Algoritmo: Algoritmo: Remover nodo do topo de Pilha implementada sobre Arranjo
Estruturas de Dados 18
?
Lim
Topo
Base
Pilha
10
9
8
7
6
5
4
3
2
1
Pilha – contiguidade física
Acesso à pilha
• Somente ao nodo do topo da pilha
• Para consulta e/ou modificação
Estruturas de Dados 19
Algoritmo 4.4 - ConsultarPilhaArr Entradas: Pilha (TipoPilha) Base (inteiro) Topo (inteiro) Saídas: Valor (TipoNodo) Sucesso(lógico)início se Topo ≥ Base então início Valor ← Pilha[Topo] Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Algoritmo: Algoritmo: Consultar nodo do topo de Pilha implementada sobre Arranjo
Estruturas de Dados 20
Pilhas
Pilhas implementadas por encadeamento
Estruturas de Dados 21
Base
Topo
inserçõesremoções
?consultas
PtPilha
Info Elo
Topo da pilha
Base da pilha
Endereço do topo da pilha
Pilha implementada por encadeamento
TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro
Tipo de dados utilizado nos algoritmos:
Estruturas de Dados 22
Pilha por encadeamento
Criação de pilha encadeada
• Pilha criada vazia
• Atribuir endereço nulo para apontador que contém o
endereço do topo da pilha
Estruturas de Dados 23
Algoritmo: Algoritmo: Criar Pilha Encadeada
Pilha por encadeamento
Algoritmo 4.5 - CriarPilhaEnc Entradas: - Saída: PtPilha (TipoPtNodo)início PtPilha ← nulofim
Estruturas de Dados 24
Inserção de um nodo em pilha encadeada
Pilha por encadeamento
• Novo nodo inserido sempre no topo da pilha
Topo
TopoPtPilha PtPilha
Topo
Novo nodo
Base Base
Estruturas de Dados 25
Algoritmo 4.6 - InserirPilhaEnc Entradas: PtPilha (TipoPtNodo) Valor (TipoInfo) Saída: PtPilha (TipoPtNodo) Variável local: PtNovo (TipoPtNodo)início alocar(PtNovo) PtNovo↑.Info ← Valor PtNovo↑.Elo ← PtPilha PtPilha ← PtNovofim
Algoritmo: Algoritmo: Inserir nodo em Pilha Encadeada
Pilha por encadeamento
Estruturas de Dados 26
Remoção de um nodo de uma pilha encadeada
Pilha por encadeamento
• Só pode ser removido o nodo do topo da pilha
PtPilha
Topo
Topo
PtPilha
Base Base
Nodo a ser removido
Estruturas de Dados 27
Pilha por encadeamento
Algoritmo: Algoritmo: Remover nodo de Pilha Encadeada
Algoritmo 4.7 - RemoverPilhaEnc Entrada: PtPilha (TipoPtNodo) Saídas: PtPilha (TipoPtNodo) Sucesso (lógico) Variável local: PtAux (TipoPtNodo)início se PtPilha ≠ nulo então início PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 28
Acesso à pilha encadeada
Pilha por encadeamento
• Só pode ser acessado o nodo do topo da pilha
Topo
PtPilha
Base
Nodo que pode ser acessado
Estruturas de Dados 29
Pilha por encadeamento
Algoritmo: Algoritmo: Consultar nodo do topo de Pilha Encadeada
Algoritmo 4.8 - ConsultarPilhaEnc Entrada: PtPilha (TipoPtNodo) Saídas: Valor (TipoInfo) Sucesso (lógico) início se PtPilha = nulo então Sucesso ← falso senão início Sucesso ← verdadeiro Valor ← PtPilha↑.Info fimfim
Estruturas de Dados 30
Pilha por encadeamento
Algoritmo: DesempilharAlgoritmo: DesempilharConsulta nodo do topo da pilha, e o remove da pilha
Algoritmo 4.9 - Desempilhar Entrada: PtPilha (TipoPtNodo) Saídas: PtPilha (TipoPtNodo) Valor (TipoInfo) Sucesso (lógico) Variável local: PtAux (TipoPtNodo)início se PtPilha = nulo então Sucesso ← falso senão início Sucesso ← verdadeiro Valor ← PtPilha↑.Info PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) fimfim
Estruturas de Dados 31
PtPilha = nilBase
Topo
Base
Topo
Base
Topo
Base
Topo
PtPilha
PtPilha
PtPilha
Destruição de uma pilha encadeada
Pilha por encadeamento
• Liberar espaço ocupado pelos nodos, sempre a partir do topo da pilha
• No final: apontador para o topo = endereço nulo
Estruturas de Dados 32
Pilha por encadeamento
Algoritmo: Algoritmo: Destruir Pilha Encadeada
Algoritmo 4.10 - DestruirPilhaEnc Entrada: PtPilha (TipoPtNodo) Saída: PtPilha (TipoPtNodo) Variável local: PtAux (TipoPtNodo)início enquanto PtPilha ≠ nulo faça início PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) fimfim
Estruturas de Dados 33
Pilhas e filas
Filas
Estruturas de Dados 34
Filas
Operações válidas:Operações válidas:
• Criar uma fila vazia
• Inserir um nodo no final da fila
• Excluir o nodo do início da fila
• Consultar / modificar nodo do início da fila
• Destruir a fila
InserçõesExclusões
eConsultas
FinalInício
Filas
Estruturas de Dados 35
Filas
Filas implementadas por contiguidade física
Estruturas de Dados 36
LI : limite inferior da área
IF : início da fila
FF : final da fila
LS : limite superior da área
Fila vaziaFila vazia
IF = 0
Inserções
ExclusõeseConsultas
Fila implementada sobre arranjo
1 2 3 4 5 6 7 8 9 10 12 13 14
LI LSIF FF
FILA
Fila por contiguidade
Estruturas de Dados 37
Evolução da Fila
Fila por contiguidade
2. Inicializar a fila
3. Inserir um novo nodo com valor 3
4. Inserir um novo nodo com valor 7
5. Inserir um novo nodo com valor 5
6. Remover um nodo
FILA
1 2 43 65
1 2 43 65
FILA
LI=IF=FF LS
3
1 2 43 65
FILA
LI=IF LS
3 7
FF
1 2 43 65
FILA
LI=IF LS
3 7 5
FF
1 2 43 65
FILA
LI LS
7 5
FFIF
Estruturas de Dados 38
Ocupação circular do arranjo
LSFFIF
LI
FILA1 2 3 4 5 6 7 8 9 10 12 13 14
1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI
FILA
1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI
FILA
1 2 3 4 5 6 7 8 9 10 12 13 14LS
FFIFLI
FILA
1 2 3 4 5 6 7 8 9 10 12 13 14LSFF IFLI
FILA
Fila por contiguidade
Estruturas de Dados 39
Operações sobre Filasimplementadas por contiguidade
Fila por contiguidade
• Criar uma fila vazia
• Inserir um nodo no final da fila
• Excluir o nodo do início da fila
• Consultar / modificar nodo do início da fila
TipoFila = arranjo [1..N] de TipoNodo
Tipo de dados utilizado nos algoritmos para fila implementada
por contiguidade física:
Estruturas de Dados 40
... ...FFIF LI LS
Espaço disponível para a fila
FILA
Criação de uma fila
Fila por contiguidade
• Inicializar variáveis que controlam início e final da fila e início
e final da área disponível para a fila
Estruturas de Dados 41
Algoritmo: Algoritmo: Inicializar Fila implementada sobre Arranjo
Fila por contiguidade
Algoritmo 4.11 - InicializarFilaArr Entrada: LI (inteiro) Saídas: IF, FF (inteiros)início IF ← FF ← LI – 1fim
Estruturas de Dados 42
Testar se tem espaço livre para inserir:
... ... atrás
na frente... ...
no meio... ...
LI
LI
LI
LS
LS
LS
IF
IF
IF
FF
FF
FF
Inserção de um nodo em uma fila
Fila por contiguidade
• Nodo inserido sempre no final da fila
Estruturas de Dados 43
Algoritmo: Algoritmo: Inserir um nodo em uma Fila implementada sobre Arranjo
Algoritmo 4.12 - InserirFilaArr Entradas: Fila (TipoFila) LI, LS, IF, FF (inteiros) Info (TipoNodo) Saídas: IF, FF (inteiros) Sucesso (lógico)início se (FF ≠ IF - 1) e ((IF ≠ LI) ou (FF ≠ LS)) então início se IF = LI - 1 então IF ← FF ← LI {INSERÇÃO DO PRIMEIRO NODO} senão se FF = L então FF ← LI {INSERÇÃO NO INÍCIO} senão FF ← FF + 1 {INSERÇÃO NO MEIO OU ATRÁS} FILA[FF] ← Info Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 44
Remoção de um nodo de uma fila
Fila por contiguidade
• Nodo removido é sempre o do início da fila
1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI
FILA
1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI
FILA
Nodo que pode ser removido
Estruturas de Dados 45
Algoritmo: Algoritmo: Remover um nodo de uma Fila implementada sobre Arranjo
Algoritmo 4.13 - RemoverFilaArr Entradas: LI, LS, IF, FF (inteiros) Saídas: IF, FF (inteiros) Sucesso (lógico)início se IF ≠ LI - 1 então início se IF = FF então IF ← FF ← LI - 1 {FILA FICA VAZIA} senão se IF = LS então IF ← LI senão IF ← IF + 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 46
Acesso à fila
Fila por contiguidade
• Só o nodo do início da fila pode ser acessado
• Acesso para consulta e/ou alteração
?... ...LSFFIFLI
Nodo que pode ser acessado
Estruturas de Dados 47
Algoritmo: Algoritmo: Consultar Fila implementada sobre Arranjo
Fila por contiguidade
Algoritmo 4.14 - ConsultarFilaArr Entradas: Fila (TipoFila) LI, IF (inteiros) Saídas: Info (TipoNodo) Sucesso (lógico)início se IF ≠ LI - 1 então início Info ← Fila[IF] Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 48
Filas
Filas implementadas por encadeamento
Estruturas de Dados 49
InserçõesExclusões e
Consultas
FinalFrente
Filas implementadas por encadeamento
Filas por encadeamento
TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro
Tipo de dados para nodos da fila:
F1 FnF3F2
PtFila
Endereço do primeiro da fila, para remoção
Endereço do final da fila, para inserção
Info Elo
Para acessar o último nodo, é necessário percorrer toda a fila a partir do primeiro nodo
Estruturas de Dados 50
Descritor
Prim: primeiro da fila
Ult : último da fila
Filas por encadeamento com descritor
Filas por encadeamento
PtDF
Prim Ult
L1 L2 L4L3
TipoDFila = registro Prim: TipoPtNodo Ult: TipoPtNodo fim registroTipoPtDFila = ↑TipoDFila
Tipo de dados para o descritor da fila:
Estruturas de Dados 51
Operações sobre Filas implementadas por encadeamento com descritor
• Criar uma fila vazia
• Inserir um nodo no final da fila
• Excluir o nodo do início da fila
• Consultar / modificar nodo do início da fila
• Destruir a fila
Filas por encadeamento
Estruturas de Dados 52
Filas por encadeamento
• Alocar o descritor da fila
• Descritor inicializado em endereços nulos
• Fila vazia
Criação da fila encadeada
PtDF
Prim Ult
Estruturas de Dados 53
Algoritmo: Algoritmo: Criar Fila Encadeada endereçada por descritor
Filas por encadeamento
Algoritmo 4.15 - CriarFilaEnc Entradas: - Saída: PtDFila (TipoPtDFila)início alocar(PtDFila) PtDFila↑.Prim ← nulo PtDFila↑.Ult ← nulo fim
Estruturas de Dados 54
Filas por encadeamento
Inserção de um nodo na fila encadeada
PtDFila Prim Ult
/
PtDFila Prim UltPtDFila Prim Ult
PtDFila Prim Ult
Estruturas de Dados 55
Algoritmo: Algoritmo: Inserir novo nodo em Fila Encadeadaendereçada por descritor
Filas por encadeamento
Algoritmo 4.16 - InserirFilaEnc Entradas: PtDFila (TipoPtDFila) Valor (TipoInfo) Saídas: - Variável auxiliar: PtNovo (TipoPtNodo)início alocar(PtNovo) PtNovo↑.Info ← Valor PtNovo↑.Elo ← nulo se PtDFila↑.Prim = nulo então PtDFila↑.Prim ← PtNovo senão (PtDFila↑.Ult)↑.Prox ← PtNovo PtDFila↑.Ult ← PtNovofim
Estruturas de Dados 56
Filas por encadeamento
Remoção de um nodo de fila encadeada
PtDFila Prim Ult
/
PtDFila Prim Ult
/
PtDFila Prim Ult
/
PtDFila Prim Ult
Estruturas de Dados 57
Algoritmo: Algoritmo: Remover um nodo de Fila Encadeadaendereçada por descritor
Filas por encadeamento
Algoritmo 4.17 - RemoverFilaEnc Entrada: PtDFila (TipoPtDFila) Saída: Sucesso (lógico) Variável auxiliar: PtAux (TipoPtNodo)início se PtDFila↑.Prim ≠ nulo então início PtAux ← PtDFila↑.Prim PtDFila↑.Prim ← PtAux↑.Elo liberar(PtAux) se PtDFila↑.Prim = nulo então PtDFila↑.Ult ← nulo Sucesso ← verdadeiro fimsenão Sucesso ← falsofim
Estruturas de Dados 58
PtDFila Prim Ult
/??
Filas por encadeamento
Remoção de um nodo de fila encadeada
• Só o nodo do início da fila pode ser acessado
• Acessado diretamente pelo endereço no descritor
Estruturas de Dados 59
Algoritmo: Algoritmo: Consultar Fila Encadeada endereçada por descritor
Filas por encadeamento
Algoritmo 4.18 - ConsultarFilaEnc Entrada: PtDFila (TipoPtDFila) Saídas: Valor (TipoInfo) Sucesso (lógico)início se PtDFila↑.Prim ≠ nulo então início Valor ← PtDFila↑.Prim↑.Info Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 60
Filas por encadeamento
Destruição de fila encadeada
PtDFila
/
Prim Ult
PtDFila Prim Ult
PtDFila = nulo
Liberar posições
ocupadas pela lista
Liberar descritor
Estruturas de Dados 61
Algoritmo: Algoritmo: Destruir Fila Encadeada endereçada por descritor
Filas por encadeamento
Algoritmo 4.19 - DestruirFilaEnc Entrada: PtDFila (TipoPtDFila) Saída: PtDFila (TipoPtDFila) Variáveis auxiliares: P1, P2 (TipoPtNodo)início se PtDFila↑.Prim ≠ nulo então início P1 ← PtDFila↑.Prim repita P2 ← P1↑.Elo liberar(P1) P1 ← P2 até P1 = nulo fim liberar(PtDFila) PtDFila ← nulofim
Estruturas de Dados 62
Filas
Fila dupla - Deque
Estruturas de Dados 63
ConsultasConsultas
Início Final
Exclusões
Inserções
Exclusões
Inserções
Fila dupla
Fila dupla - Deque
• Inserção, remoção e acesso às duas extremidades
Estruturas de Dados 64
Operações válidas:Operações válidas:
• Criar uma fila dupla vazia
• Inserir um nodo no início
• Inserir um nodo no fim
• Excluir um nodo do início
• Excluir um nodo do fim
• Consultar / modificar nodo do início ou do fim
• Destruir a fila dupla
Fila dupla
Fila dupla - Deque
Estruturas de Dados 65
Fila dupla
Fila dupla implementada por contiguidade física
Estruturas de Dados 66
LI : limite inferior da área no arranjoIF : início da filaFF : final da filaLS : limite superior da área disponível
1 2 3 4 5 6 7 8 9 10 12 13 14
LI LSIF FF
Deque
Fila dupla por contiguidade
Fila dupla implementada sobre arranjo
ConsultasConsultas
Início Final
Exclusões
Inserções
Exclusões
Inserções
TipoFila = arranjo [1..N] de TipoNodo
Tipo de dados para fila dupla por contiguidade:
Estruturas de Dados 67
Criação de uma fila dupla
• Inicializar indicadores de início e final da fila
dupla
• Fila criada vazia
0 1 2 3 4 5 6 7 8 9 10 12 13 14
LI LSIF
FF
Deque
Fila dupla por contiguidade
Estruturas de Dados 68
Algoritmo: Algoritmo: Inicializar Deque implementada sobre Arranjo
Algoritmo 4.20 - InicializarDequeArr Entrada: LI (inteiro) Saídas: IF, FF (inteiros)início IF ← FF ← LI – 1fim
Fila dupla por contiguidade
Estruturas de Dados 69
Inserção de um nodo em uma fila dupla
Fila dupla por contiguidade
• A inserção pode ser feita em qualquer uma das duas extremidades
• Definir em qual extremidade deve ser inserido o novo nodo
• Ocupação circular do arranjo
Início Final
Inserção Inserção
Estruturas de Dados 70
LSFFLI
DEQUE1 2 3 4 5 6 7 8 9 10 12 13 14
LSFFIFLI1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
LSFF
LI1 2 3 4 5 6 7 8 9 10 12 13 14
LSFF
IFLI1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
DEQUE
Inserção no final
Ocupação circular do arranjo:
Fila dupla por contiguidade
Estruturas de Dados 71
LSFFLI
DEQUE1 2 3 4 5 6 7 8 9 10 12 13 14
LSFFIFLI1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
LSFFLI1 2 3 4 5 6 7 8 9 10 12 13 14
LSFFIF
LI1 2 3 4 5 6 7 8 9 10 12 13 14
IF
DEQUE
DEQUE
Inserção no início
Ocupação circular do arranjo:
Fila dupla por contiguidade
Estruturas de Dados 72
Algoritmo: Algoritmo: Inserir um nodo no Início de Dequeimplementada sobre ArranjoAlgoritmo 4.21 - InserirIniDequeArr Entrada: Deque (TipoDequeArr) LI, LS, IF, FF (inteiros) Info (TipoNodo) Saídas: Deque (TipoDequeArr) IF, FF (inteiros) Sucesso (lógico)início se ((FF = IF - 1) ou ((IF = LI) e (FF = LS))) então Sucesso ← falso senão início Sucesso ← verdadeiro se IF = LI – 1 {DEQUE VAZIA} então IF ← FF ← LI senão se IF > LI então IF ← IF – 1 senão IF ← LS Deque[IF] ← Info fimfim
Estruturas de Dados 73
Remoção de um nodo de uma fila dupla
Fila dupla por contiguidade
• A remoção pode ser feita em qualquer uma das duas extremidades
• Definir de qual extremidade deve ser removido o novo nodo
Início Final
Remoção Remoção
Estruturas de Dados 74
Algoritmo: Algoritmo: Remover o nodo do Fim da Dequeimplementada sobre Arranjo
Algoritmo 4.22 - RemoverFimDequeArr Entradas: LI, LS, IF, FF (inteiros) Saídas: IF, FF (inteiros) Sucesso (lógico)início se IF ≠ LI – 1 então início se IF = FF {DEQUE VAI FICAR VAZIA} então IF ← FF ← LI - 1 senão se FF = LI então FF ← LS senão FF ← FF - 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim
Estruturas de Dados 75
Acesso a uma fila dupla
Fila dupla por contiguidade
Início Final
Acesso Acesso
• Somente os nodos das duas extremidades podem ser acessados
Estruturas de Dados 76
Algoritmo: Algoritmo: Consultar qual o Maior valor contido nas extremidades de uma Deque implementada sobre Arranjo
Algoritmo 4.23 - ConsultarMaiorDequeArr Entradas: Deque (TipoDequeArr) LI, IF, FF (inteiros) Saída: MaiorValor (inteiro)início se IF = LI - 1 então MaiorValor ← 0 senão se Deque[IF] > Deque[FF] então MaiorValor ← Deque[IF] senão MaiorValor ← Deque[FF]fim
Estruturas de Dados 77
Fila dupla
Fila dupla implementada por contiguidade física
Estruturas de Dados 78
F1 FnF3F2
PtFilaDupla
Início
Final
Fila dupla implementada por encadeamento
Fila dupla por encadeamento
Exclusões
InserçõesAcesso
Exclusões
InserçõesAcesso
Para acessar o último nodo, é necessário percorrer toda a lista a partir do primeiro nodo
Estruturas de Dados 79
Fila dupla encadeada com descritorFila dupla por encadeamento
PtDFD
/
Prim Ult
Na remoção do último nodo, precisa atualizar descritor
que passará a apontar para o penúltimo – percorrer a
fila do início para chegar ao penúltimo
Estruturas de Dados 80
TipoNodo = registro Ant: TipoPtNodo Info: TipoInfoNodo Prox: TipoPtNodo
fim registro
Tipo de dados para nodos da fila dupla:
TipoDDeque = registro Prim: TipoPtNodo Ult: TipoPtNodo fim registoTipoPtDDeque = ↑TipoDDeque
Tipo de dados para o descritor da fila dupla:
Descritor
Prim: primeiro da filaUlt : último da fila
PtDFDPrim Ult
Ant Info Prox
Fila dupla – duplo encadeamento e descritor
Fila dupla por encadeamento
Estruturas de Dados 81
Criação de fila dupla encadeada
Fila dupla por encadeamento
• Alocação do descritor
• Inicialização do descritor para fila dupla vazia
PtDFDPrim Ult
Estruturas de Dados 82
Algoritmo 4.24 - CriarDequeEnc Entradas: - Saída: PtDDeque (TipoPtDDeque)início alocar(PtDDeque) PtDDeque↑.Prim ← PtDDdeque↑.Ult ← nulo fim
Algoritmo: Algoritmo: Criar Deque implementada por Encadeamento
Fila dupla por encadeamento
Estruturas de Dados 83
Inserção de um novo nodo
Fila dupla por encadeamento
PtDFDPrim Ult
PtDFDPrim Ult
A
CA B
B N
N
C
PtDFDPrim Ult
CA B
No início
No final
Estruturas de Dados 84
Algoritmo: Algoritmo: Inserir nodo em Deque Encadeada
Algoritmo 4.25 - InserirDequeEnc Entradas: PtDeque (TipoPtDeque) Lado (caractere) Valor (TipoInfoNodo) Saída: Sucesso (lógico)var PtNovo (TipoPtNodo)início Sucesso ← falso se (Lado = “I”) ou (Lado = “F”) então início Sucesso ← verdadeiro alocar(PtNovo) PtNovo↑.Info ← Valor se Lado = “I” { então início {INSERE NO INÍCIO} SEGUE }
Fila dupla por encadeamento
Estruturas de Dados 85
então início {INSERE NO INÍCIO} PtNovo↑.Ant ← nulo se PtDDeque↑.Prim = nulo então início PtDDeque↑.Ult ← PtNovo PtNovo↑.Prox ← nulo fim senão início PtNovo↑.Prox ← PtDDeque↑.Prim (PtDDeque↑.Prim)↑.Ant ← PtNovo fim PtDDeque↑.Prim ← PtNovo fim senão início {INSERE NO FINAL} PtNovo↑.Prox ← nulo se PtDDeque↑.Prim = nulo então início PtNovo↑.Ant ← nulo PtDDeque↑.Prim ← PtNovo fim senão início (PtDDeque↑.Ult)↑.Prox ← PtNovo PtNovo↑.Ant ← PtDDeque↑.Ult fim PtDDeque↑.Ult ← PtNovo fim fimfim
Algoritmo (cont): Algoritmo (cont): Inserir nodo em Deque Encadeada
Estruturas de Dados 86
Remoção de um nodo
Fila dupla por encadeamento
PtDFDPrim Ult
PtDFDPrim Ult
A
CA B
B X
X
C
Do final
Do início
PtDFDPrim Ult
CA B
Estruturas de Dados 87
Algoritmo: Algoritmo: Remover nodo de Deque Encadeada
Fila dupla por encadeamento
Algoritmo 4.26 - RemoverDequeEnc Entradas: PtDDeque (TipoPtDDeque) Lado (caractere) Saída: Sucesso (lógico)var PtAux, PtAnt (TipoPtNodo);início Sucesso ← falso se (PtDDeque↑.Prim ≠ nulo) e ((Lado = “I”) ou (Lado = “F”)) então início Sucesso ← verdadeiro se Lado = “I” { então início {REMOVE O PRIMEIRO} SEGUE }
Estruturas de Dados 88
então início {REMOVE O PRIMEIRO} PtAux ← PtDDeque↑.Prim se PtDDeque↑.Prim = PtDDeque↑.Ult então PtDDeque↑.Prim ← PtDDeque↑.Ult ← nulo senão início PtDDeque↑.Prim ← PtAux↑.Prox (PtDDeque↑.Prim)↑.Ant ← nulo fim fim senão início {REMOVE O ÚLTIMO} PtAux ← PtDDeque↑.Ult se PtDDeque↑.Prim = PtDDeque↑.Ult então PtDDeque↑.Prim ← PtDDeque↑.Ult ← nulo senão início PtDDeque↑.Ult ← PtAux↑.Ant (PtDDeque↑.Ult)↑.Prox ← nulo fim fim liberar(PtAux) fimfim
Algoritmo (cont.): Algoritmo (cont.): Remover nodo de Deque Encadeada
Estruturas de Dados 89
Acesso a fila dupla encadeada
Fila dupla por encadeamento
Início FinalAcesso Acesso
PtDFD
Prim Ult
CA BX
• Podem ser acessados o primeiro e último nodo
• Endereços diretamente no descritor
Estruturas de Dados 90
Algoritmo: Algoritmo: Consultar Deque implementada por Encadeamento
Fila dupla por encadeamento
Algoritmo 4.27 - ConsultarDequeEnc Entradas: PtDDeque (TipoPtDDeque) Lado (caractere) Saídas: Valor (TipoInfoNodo) Sucesso (lógico)início Sucesso ← falso se (PtDDeque↑.Prim ≠ nulo) e ((Lado = “I”) ou (Lado = “F”)) então início Sucesso ← verdadeiro se Lado = “I” então Valor ← (PtDDeque↑.Prim).Info senão Valor ← (PtDDeque↑.Ult).Info; fimfim