Escolar Documentos
Profissional Documentos
Cultura Documentos
PCO001 Pilha Fila PDF
PCO001 Pilha Fila PDF
PCO001
Algoritmos e Estruturas de Dados
Pilha e Fila
Sandro Izidoro
30 de março de 2023
Sumário
1 Considerações Iniciais
2 Pilha
3 Fila
4 Referências
Considerações Iniciais
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.
Considerações Iniciais
Pilha
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:
Pilha
Pode-se implementar uma pilha usando dois recursos básicos das linguagens de
programação:
1 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.
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 }
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
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 }
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 ’ ) ;
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 }
Fila
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:
Esta situação pode ser visualizada como uma Fila Circular (Figura (b)).
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 }
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) ;
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 }
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 ;
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 ;
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 }
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).