Você está na página 1de 30

Considerações Iniciais Pilha Fila Referências

PCO001
Algoritmos e Estruturas de Dados
Pilha e Fila

Sandro Izidoro

Universidade Federal de Itajubá - UNIFEI


Campus Itabira

30 de março de 2023

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 1 / 30


Considerações Iniciais Pilha Fila Referências

Sumário

1 Considerações Iniciais

2 Pilha

3 Fila

4 Referências

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 2 / 30


Considerações Iniciais Pilha Fila Referências

Considerações Iniciais

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 3 / 30


Considerações Iniciais Pilha Fila Referências

Considerações Iniciais

Existem determinadas estruturas de dados que não utilizam de ordem para organi-
zar seus dados. Para determinadas aplicações é imposto um critério que restringe
a inserção e retirada dos elementos que compõem um conjunto de dados, ou seja,
são definidas disciplinas de acessos.

Disciplina de acesso é a forma pela qual os elementos de uma determinada estru-


tura de dados serão inseridos e retirados desta estrutura.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 4 / 30


Considerações Iniciais Pilha Fila Referências

Considerações Iniciais

Os dois critérios mais usuais são:

LIFO (Last In First Out)

Dentre os elementos que ainda permanecem no conjunto, o primeiro a ser retirado


é o ultimo que tiver sido inserido. Este critério é utilizado na estrutura de dados
denominada Pilha.

FIFO (First In First Out)

Dentre os elementos que ainda permanecem no conjunto, o primeiro elemento a


ser retirado é o primeiro que tiver sido inserido. Esse critério caracteriza a estrutura
de dados Fila.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 5 / 30


Considerações Iniciais Pilha Fila Referências

Pilha

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 6 / 30


Considerações Iniciais Pilha Fila Referências

Pilha

Uma pilha é uma estrutura linear de dados que pode ser acessada somente por
uma de suas extremidades para armazenar e recuperar dados. Ela é definida em
termos das operações que modificam e das que verificam seu status:

IniciarPilha - Limpa a pilha;

PilhaVazia - Verifica se a pilha está vazia;

PilhaCheia - Verifica se há espaço para inserir novos elementos na pilha;

Empilha - Insere um novo elemento na pilha;

Desempilha - Retira um elemento da pilha (o elemento mais alto da pilha);

TopoPilha - Retorna o elemento mais alto da pilha sem removê-lo.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 7 / 30


Considerações Iniciais Pilha Fila Referências

Pilha

Pode-se implementar uma pilha usando dois recursos básicos das linguagens de
programação:

1 Vetor;

2 Alocação Dinâmica de Memória.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 8 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Vetor

Para implementar uma pilha através de uma estrutura estática, além do vetor onde
serão armazenados os elementos da pilha, será necessário uma variável inteira
que sinalize a posição do último elemento inserido, ou seja, o Topo da pilha.
Para iniciar esta estrutura, basta atribuir o valor -1 para o campo Topo.
Geralmente, a pilha é muito útil nas situações em que os dados tem que ser arma-
zenados e então recuperados na ordem inversa.
Uma aplicação da pilha é o casamento de delimitadores em um programa. Esse é
um exemplo importante, porque o casamento de delimitadores é parte de qualquer
compilador.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 9 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Vetor I

1
2 / / Exemplo 01 − Implementacao de P i l h a U t i l i z a n d o V e t o r
3
4 # include < iostream >
5
6 using namespace s t d ;
7
8 # define TAM 10
9
10 s t r u c t No {
11 char Chave ;
12 i nt Valor ;
13 };
14
15 struct Pilha {
16 No Dados [TAM ] ;
17 i n t Topo ;
18 };
19
20 void I n i c i a P i l h a ( P i l h a& P) {
21 P . Topo = −1;
22 }
23
24 bool P i l h a V a z i a ( P i l h a P) {
25 i f ( P . Topo == −1)
26 return true ;
27 return false ;
28 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 10 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Vetor II

29
30 bool P i l h a C h e i a ( P i l h a P) {
31 i f ( P . Topo == TAM − 1 )
32 return true ;
33 return false ;
34 }
35
36 bool Empilha ( P i l h a& P , No Novo ) {
37 i f ( P i l h a C h e i a (P) )
38 return false ;
39 P . Dados [++P . Topo ] = Novo ;
40 return true ;
41 }
42
43 bool Desempilha ( P i l h a& P , No& Novo ) {
44 i f ( P i l h a V a z i a (P) )
45 return false ;
46 Novo = P . Dados [ P . Topo − − ] ;
47 return true ;
48 }
49
50 i n t main ( ) {
51
52 Pilha P;
53 I n i c i a P i l h a (P) ;
54
55 No Aux ;
56

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 11 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Vetor III

57
58 Aux . Chave = ’ a ’ ;
59 Aux . V a l o r = 1 ;
60 Empilha ( P , Aux ) ;
61
62 Aux . Chave = ’ b ’ ;
63 Aux . V a l o r = 2 ;
64 Empilha ( P , Aux ) ;
65
66 while ( Desempilha ( P , Aux ) )
67 c o u t << " Chave desempilhada : " << Aux . Chave << e n d l ;
68
69 i f ( P i l h a V a z i a (P) )
70 c o u t << " P i l h a v a z i a " << e n d l ;
71
72 return 0;
73 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 12 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Alocação Dinâmica de Memória

A estrutura de dados Pilha também pode ser implementada utilizando alocação


dinâmica de memória.
Ela se assemelha a uma lista encadeada cuja a inserção somente acontece na
primeira posição da lista, facilitando o procedimento de remoção que, obviamente,
deve ser o primeiro elemento.
Neste tipo de implementação não há necessidade da primitiva PilhaCheia, uma
vez que, teoricamente, toda memória está disponível para a alocação.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 13 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Alocação Dinâmica de Memória I

1 / / Exemplo 02 − Implementacao de P i l h a U t i l i z a n d o Alocacao Dinamica de Memoria *


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 s t r u c t No {
8 char I n f o ;
9 No * L i g ;
10 };
11
12 typedef No * P i l h a ;
13
14 void I n i c i a P i l h a ( P i l h a& Topo ) {
15 Topo = NULL ;
16 }
17
18 P i l h a TopoPilha ( P i l h a Topo ) {
19 No * Aux = new No ;
20 Aux = Topo ;
21 r e t u r n Aux ;
22 }
23
24 bool P i l h a V a z i a ( P i l h a& Topo ) {
25 i f ( Topo == NULL )
26 return true ;
27 return false ;
28 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 14 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Alocação Dinâmica de Memória II

29
30 void Empilha ( P i l h a& Topo , char Elemento ) {
31 No * Aux = new No ;
32 Aux−> I n f o = Elemento ;
33 Aux−> L i g = Topo ;
34 Topo = Aux ;
35 }
36
37 bool Desempilha ( P i l h a& Topo , char& Elemento ) {
38 i f ( P i l h a V a z i a ( Topo ) )
39 return false ;
40 Elemento = Topo−> I n f o ;
41 No * Aux = Topo ;
42 Topo = Topo−> L i g ;
43 d e l e t e Aux ;
44 return true ;
45 }
46
47 i n t main ( ) {
48
49 P i l h a Topo ;
50 I n i c i a P i l h a ( Topo ) ;
51
52 char Elemento ;
53
54 Empilha ( Topo , ’a ’ ) ;
55 Empilha ( Topo , ’b ’ ) ;
56 Empilha ( Topo , ’c ’ ) ;

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 15 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Pilha Utilizando Alocação Dinâmica de Memória III

57
58 while ( Desempilha ( Topo , Elemento ) )
59 c o u t << " Desempilhando elemento −> " << Elemento << e n d l ;
60
61 i f ( P i l h a V a z i a ( Topo ) )
62 c o u t << " P i l h a Vazia " << e n d l ;
63
64 d e l e t e Topo ;
65
66 return 0;
67 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 16 / 30


Considerações Iniciais Pilha Fila Referências

Fila

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 17 / 30


Considerações Iniciais Pilha Fila Referências

Fila

Uma Fila é simplesmente uma linha de espera que cresce somando elementos ao
seu final e que diminui tomando elementos de sua frente.
Diferente de uma Pilha, uma Fila é uma estrutura na qual ambas as extremidades
são usadas: uma para adicionar novos elementos e outra para removê-los.
Em consequência, o último elemento tem que esperar até que todos os elementos
que o precedem na fila sejam removidos. As operações de uma Fila são:

IniciarFila - Limpa a fila;

FilaVazia - Verifica se a fila está vazia;

FilaCheia - Verifica se há espaço para inserir novos elementos na fila;

InsereFila - Insere um novo elemento na fila;

RetiraFila - Retira um elemento da fila;

Primeiro - Retorna o primeiro elemento da fila sem removê-lo.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 18 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor

Os elementos são adicionados ao final da Fila, mas, como as posições liberadas


durante a operação de remoção devem ser reaproveitadas, o final da Fila pode
ocorrer antes da posição de início da Fila dentro do vetor.

Esta situação pode ser visualizada como uma Fila Circular (Figura (b)).

A Fila estará cheia se o primeiro elemento estiver na primeira célula e o último


elemento na última (Figura (a)).

A Figura (c) demonstra uma Fila Circular.

Se o último elemento está na última célula e se quaisquer células estão disponíveis


no início do vetor, um novo elemento é adicionado (Figura (d)).

Se o último elemento estiver em qualquer outra posição, então o novo elemento é


adicionado depois do último, se houver espaço (Figura (e)).

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 19 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor

Figura: Implementação de uma Fila Circular.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 20 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor

Figura: Implementação de uma Fila Circular.

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 21 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor I

1 / / Exemplo 03 − Implementacao de F i l a U t i l i z a n d o V e t o r
2
3 # include < iostream >
4 using namespace s t d ;
5 # define T 10
6
7 s t r u c t No {
8 i nt Valor ;
9 };
10
11 struct F i l a {
12 No Dados [ T ] ;
13 i n t Tam ;
14 i n t Com;
15 i n t Fim ;
16 };
17
18 void I n i c i a F i l a ( F i l a & F ) {
19 F . Fim = −1;
20 F .Com = 0 ;
21 F . Tam = 0 ;
22 }
23
24 bool F i l a V a z i a ( F i l a F ) {
25 i f ( F . Tam == 0 )
26 return true ;
27 return false ;
28 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 22 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor II

29
30 bool F i l a C h e i a ( F i l a F ) {
31 i f ( F . Tam == T )
32 return true ;
33 return false ;
34 }
35
36 bool I n s e r e F i l a ( F i l a & F , No Novo ) {
37 i f ( FilaCheia (F) )
38 return false ;
39 F . Tam++;
40 F . Fim = ( F . Fim + 1 ) % T ;
41 F . Dados [ F . Fim ] = Novo ;
42 return true ;
43 }
44
45 bool R e t i r a F i l a ( F i l a & F , No& Novo ) {
46 i f ( FilaVazia (F) )
47 return false ;
48 F . Tam− −;
49 Novo = F . Dados [ F .Com ] ;
50 F .Com = ( F .Com + 1 ) % T ;
51 return true ;
52 }
53
54 i n t main ( ) {
55 Fila F;
56 I n i c i a F i l a (F) ;

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 23 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Vetor III

57
58 No Aux ;
59
60 Aux . V a l o r = 1 ;
61 I n s e r e F i l a ( F , Aux ) ;
62
63 Aux . V a l o r = 2 ;
64 I n s e r e F i l a ( F , Aux ) ;
65
66 while ( R e t i r a F i l a ( F , Aux ) )
67 c o u t << " V a l o r que s a i u da f i l a : " << Aux . V a l o r << e n d l ;
68
69 i f ( FilaVazia (F) )
70 c o u t << " F i l a v a z i a " << e n d l ;
71
72 return 0;
73 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 24 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Alocação Dinâmica I

A implementação utilizando alocação dinâmica de memória pode ser realizada


com o uso de um descritor que indica o ponteiro para o início e o fim da Fila.

1 / / Implementacao de F i l a U t i l i z a n d o Alocacao Dinamica


2
3 # include < iostream >
4
5 using namespace s t d ;
6
7 s t r u c t No {
8 char I n f o ;
9 No * L i g ;
10 };
11
12 typedef No * NoPtr ;
13
14 struct F i l a {
15 NoPtr Com;
16 i n t Nro ;
17 NoPtr Fim ;
18 };
19
20 void I n i c i a F i l a ( F i l a & F ) {
21 F . Nro = 0 ;
22 F .Com = NULL ;
23 F . Fim = NULL ;
24 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 25 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Alocação Dinâmica II

25
26 bool F i l a V a z i a ( F i l a F ) {
27 r e t u r n ! F . Nro ;
28 }
29
30 void I n s e r e F i l a ( F i l a & F , char Novo ) {
31 NoPtr P = new No ;
32 P−> I n f o = Novo ;
33 P−> L i g = NULL ;
34 i f ( F . Nro == 0 )
35 F .Com = F . Fim = P ;
36 else {
37 F . Fim−> L i g = P ;
38 F . Fim = P ;
39 }
40 F . Nro ++;
41 }
42
43 bool R e t i r a F i l a ( F i l a & F , char& V a l o r ) {
44 i f ( FilaVazia (F) )
45 return false ;
46 else {
47 NoPtr P = F .Com;
48 V a l o r = P−> I n f o ;
49 F .Com = P−> L i g ;
50 F . Nro − −;
51 i f ( F . Nro == 0 )
52 F . Fim = NULL ;

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 26 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Alocação Dinâmica III

53 delete P;
54 }
55 return true ;
56 }
57
58 NoPtr P r i m e i r o ( F i l a & F ) {
59 NoPtr P = F .Com;
60 return P;
61 }
62
63 i n t main ( ) {
64
65 Fila F;
66 I n i c i a F i l a (F) ;
67
68 i f ( FilaVazia (F) )
69 c o u t << " F i l a Vazia " << e n d l ;
70 else c o u t << " F i l a nao v a z i a " << e n d l ;
71
72 InsereFila (F, ’a ’ ) ;
73 InsereFila (F, ’b ’ ) ;
74 InsereFila (F, ’c ’ ) ;
75
76 i f ( FilaVazia (F) )
77 c o u t << " F i l a Vazia " << e n d l ;
78 else c o u t << " F i l a nao v a z i a " << e n d l ;
79
80 char v a l o r ;

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 27 / 30


Considerações Iniciais Pilha Fila Referências

Implementação de Fila Utilizando Alocação Dinâmica IV

81 while ( R e t i r a F i l a ( F , v a l o r ) )
82 c o u t << " V a l o r r e t i r a d o da f i l a : " << v a l o r << e n d l ;
83
84 i f ( FilaVazia (F) )
85 c o u t << " F i l a Vazia " << e n d l ;
86 else c o u t << " F i l a nao v a z i a " << e n d l ;
87
88 return 0;
89 }

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 28 / 30


Considerações Iniciais Pilha Fila Referências

Referências

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 29 / 30


Considerações Iniciais Pilha Fila Referências

Referências

1 Deitel, H. M. & Deitel, P. J. C++ Como Programar. 5a. edição. Porto Alegre:
Bookman, 2009.
2 Victorine Viviane Mizrahi. Treinamento em Linguagem C++ – Módulo 1 e 2.
Makon Books, São Paulo, 2007.
3 Ziviani, Nivio. Projeto de algoritmos: com implementações em Pascal e C. 3 ed
rev. e ampl. São Paulo: Cengage Learning, 2011.
4 Feofiloff, Paulo. Algoritmos em linguagem C. Rio de Janeiro: Elsevier, 2009.
5 Drozdek, Adam. Estrutura de Dados e Algoritmos em C++. Pioneira Thomson
Learning, São Paulo, 2002.
6 Material elaborado a partir das notas de aula do professor Edmilson Marmo
Moreira (UNIFEI).

Sandro Izidoro UNIFEI - ICT PCO001 30 de março de 2023 30 / 30

Você também pode gostar