O documento discute pilhas e filas, que são listas lineares especiais com disciplina restrita de organização e acesso aos seus nós. Apresenta as operações básicas de pilhas (LIFO) e filas (FIFO) e duas formas de implementação: por contiguidade física usando arranjos e por encadeamento usando ponteiros.
1. Pilhas e filas Estudo de listas lineares especiais, com disciplina restrita de organização e de acesso a seus nodos
2. Pilhas e filas Disciplina restrita acesso permitido somente em alguns n odo s Com disciplina restrita de organização e acesso a seus nodos Listas lineares especiais
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
4. Pilhas e Filas Consultas Exclusões Inserções Topo Base Início Final Inserções Exclusões e Consultas PILHA FILA
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 1 3 LIM TOPO BASE 10 9 8 7 6 5 4 3 2 1 3 7 LIM TOPO BASE 10 9 8 7 6 5 4 3 2 1 3 7 5 LIM TOPO BASE 10 9 8 7 6 5 4 3 2 1 3 7 LIM TOPO BASE 10 9 8 7 6 5 4 3 2 1 PILHA PILHA PILHA PILHA
11.
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 Exemplo: Base 1 Topo Base – 1 Lim 6 Criação da pilha Pilha – contiguidade física Lim Topo Base Pilha 10 9 8 7 6 5 4 3 2 1
13. Algoritmo 4.1 - InicializarPilhaArr Entrada: Base (inteiro) Saída: Topo (inteiro) início Topo Base – 1 fim Algoritmo: Inicializar Pilhas implementada sobre Arranjo Pilha – contiguidade física
14. Inserção de um nodo na pilha Pilha – contiguidade física 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
15. Pilha – contiguidade física 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 falso fim
16. Pilha – contiguidade física Remoçã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
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 falso fim Algoritmo: Remover nodo do topo de Pilha implementada sobre Arranjo
18.
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 falso fim Algoritmo: Consultar nodo do topo de Pilha implementada sobre Arranjo
21. Pilha implementada por encadeamento TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro Tipo de dados utilizado nos algoritmos: Base Topo inserções remoções ? consultas PtPilha Info Elo Topo da pilha Base da pilha Endereço do topo da pilha
22.
23. Algoritmo: Criar Pilha Encadeada Pilha por encadeamento Algoritmo 4.5 - CriarPilhaEnc Entradas: - Saída: PtPilha (TipoPtNodo) início PtPilha nulo fim
24.
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 PtNovo fim Algoritmo: Inserir nodo em Pilha Encadeada Pilha por encadeamento
26.
27. Pilha por encadeamento 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 falso fim
28.
29. Pilha por encadeamento 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 fim fim
30. Pilha por encadeamento Algoritmo: Desempilhar Consulta 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) fim fim
31.
32. Pilha por encadeamento 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) fim fim
36. LI : limite inferior da área IF : início da fila FF : final da fila LS : limite superior da área Fila vazia IF = 0 Fila implementada sobre arranjo Fila por contiguidade Inserções Exclusões e Consultas 1 2 3 4 5 6 7 8 9 10 12 13 14 LI LS IF FF FILA
37.
38. Ocupação circular do arranjo Fila por contiguidade LS FF IF LI FILA 1 2 3 4 5 6 7 8 9 10 12 13 14 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI FILA 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI FILA 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI FILA 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI FILA
39.
40.
41. 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 – 1 fim
42.
43. 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 falso fim
44.
45. 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 falso fim
46.
47. 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 falso fim
49. Filas implementadas por encadeamento Filas por encadeamento TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro Tipo de dados para nodos da fila: Inserções Exclusões e Consultas Final Frente F1 Fn F3 F2 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
50. Descritor Prim : primeiro da fila Ult : último da fila Filas por encadeamento com descritor Filas por encadeamento PtDF Prim Ult L1 L2 L4 L3 TipoDFila = registro Prim: TipoPtNodo Ult: TipoPtNodo fim registro TipoPtDFila = TipoDFila Tipo de dados para o descritor da fila:
51.
52.
53. 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
54. Filas por encadeamento Inserção de um nodo na fila encadeada PtDFila Prim Ult / PtDFila Prim Ult PtDFila Prim Ult PtDFila Prim Ult
55. Algoritmo: Inserir novo nodo em Fila Encadeada endereç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 PtNovo fim
56. Filas por encadeamento Remoção de um nodo de fila encadeada PtDFila Prim Ult / PtDFila Prim Ult / PtDFila Prim Ult / PtDFila Prim Ult
57. Algoritmo: Remover um nodo de Fila Encadeada endereç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 fim senão Sucesso falso fim
58.
59. 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 falso fim
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
61. 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 nulo fim
66. LI : limite inferior da área no arranjo IF : início da fila FF : final da fila LS : limite superior da área disponível Fila dupla por contiguidade Fila dupla implementada sobre arranjo TipoFila = arranjo [1..N] de TipoNodo Tipo de dados para fila dupla por contiguidade: 1 2 3 4 5 6 7 8 9 10 12 13 14 LI LS IF FF Deque Consultas Consultas Início Final Exclusões Inserções Exclusões Inserções
67.
68. Algoritmo: Inicializar Deque implementada sobre Arranjo Algoritmo 4.20 - InicializarDequeArr Entrada: LI (inteiro) Saídas: IF, FF (inteiros) início IF FF LI – 1 fim Fila dupla por contiguidade
69.
70. Inserção no final Ocupação circular do arranjo: Fila dupla por contiguidade LS FF LI DEQUE 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 IF DEQUE LS FF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 IF DEQUE DEQUE
71. Inserção no início Ocupação circular do arranjo: Fila dupla por contiguidade LS FF LI DEQUE 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 IF DEQUE LS FF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 LS FF IF LI 1 2 3 4 5 6 7 8 9 10 12 13 14 IF DEQUE DEQUE
72. Algoritmo: Inserir um nodo no Início de Deque implementada sobre Arranjo Algoritmo 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 fim fim
73.
74. Algoritmo: Remover o nodo do Fim da Deque implementada 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 falso fim
75.
76. 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
78. Fila dupla implementada por encadeamento Fila dupla por encadeamento Para acessar o último nodo, é necessário percorrer toda a lista a partir do primeiro nodo F1 Fn F3 F2 PtFila Dupla Início Final Exclusões Inserções Acesso Exclusões Inserções Acesso
79. Fila dupla encadeada com descritor Fila 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
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 registo TipoPtDDeque = TipoDDeque Tipo de dados para o descritor da fila dupla: Descritor Prim : primeiro da fila Ult : último da fila Fila dupla – duplo encadeamento e descritor Fila dupla por encadeamento PtDFD Prim Ult Ant Info Prox
81.
82. Algoritmo 4.24 - CriarDequeEnc Entradas: - Saída: PtDDeque (TipoPtDDeque) início alocar(PtDDeque) PtDDeque .Prim PtDDdeque .Ult nulo fim Algoritmo: Criar Deque implementada por Encadeamento Fila dupla por encadeamento
83. Inserção de um novo nodo Fila dupla por encadeamento PtDFD Prim Ult PtDFD Prim Ult A C A B B N N C PtDFD Prim Ult C A B No início No final
84. 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
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 fim fim Algoritmo (cont): Inserir nodo em Deque Encadeada
86. Remoção de um nodo Fila dupla por encadeamento PtDFD Prim Ult PtDFD Prim Ult A C A B B X X C Do final Do início PtDFD Prim Ult C A B
87. 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 }
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) fim fim Algoritmo (cont.): Remover nodo de Deque Encadeada
89.
90. 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; fim fim