Escolar Documentos
Profissional Documentos
Cultura Documentos
1 2
3 4
3 4
5 6
1
Listas Lineares Pilhas
◼ Para a representação de alguns modelos do ◼ Uma lista linear onde tanto a entrada quanto a saída
mundo real é necessário limitar o funcionamento precisa ser feita pela mesma extremidade é conhecida
como pilha;
das listas lineares;
◼ Neste caso o último elemento que entrar é o primeiro a
◼ É neste contexto que surgem as listas lineares
sair (Last In / First Out);
restritas. As mais utilizadas são:
◼ Existem duas funções que se aplicam a todas as pilhas:
Pilhas e PUSH: insere o item no topo da pilha;
Filas. POP: remove o item do topo da pilha.
7 8
7 8
9 10
9 10
A A
11 12
11 12
2
Pilhas (modelo conceitual) Pilhas (modelo conceitual)
Novos elementos são Novos elementos são Push
armazenados no topo armazenados no topo
da pilha. da pilha.
B B
A A
13 14
13 14
C C
B B
A A
15 16
15 16
Sequência armazenada D
em pilha.
C C
B B
A A
17 18
17 18
3
Pilhas (modelo conceitual) Pilhas (modelo conceitual)
Pop O último elemento que Pop O último elemento que
entrou será o primeiro a entrou será o primeiro a
sair (LIFO). sair (LIFO).
C B
A A
19 20
19 20
Topo →
A
21 22
21 22
Topo →
D
Topo →
push(pilha, 'D')
23 24
23 24
4
Pilhas (representação gráfica) Pilhas (representação gráfica)
D
25 26
25 26
Topo → Topo →
D D
Topo → Topo → Topo →
27 28
27 28
29 30
29 30
5
Pilhas (representação gráfica) Pilhas (representação gráfica)
Topo → Topo →
A A
push(pilha, 'V')
31 32
31 32
33 34
33 34
Topo → V Topo → V
Topo → Topo →
A A A A
pop(pilha)
35 36
35 36
6
Pilhas (representação gráfica) Pilhas (representação gráfica)
Topo → V Topo → V
Topo → Topo → Topo → Topo →
A A A A A A
push(pilha, 'B')
37 38
37 38
Topo → B
Topo → Topo →
D A A
Topo →
Topo → V Topo → B
Topo →
A A A
39 40
39 40
Topo → G
Topo → B B
A A
push(pilha, 'G')
41 42
41 42
7
Pilhas (representação gráfica) Pilhas (representação gráfica)
H
push(pilha, 'H')
43 44
43 44
45 46
45 46
Topo → H Topo → H
Topo → G G Topo → G Topo → G G Topo → G
B B B B B B
A A A A A A
pop(pilha)
47 48
47 48
8
Pilhas (representação gráfica) Pilhas (representação gráfica)
Topo → H Topo → H
Topo → G G Topo → G Topo → G G Topo → G
B B B B B B
A A A A A A
Topo → G
B Topo → B
A A
pop(pilha)
49 50
49 50
51 52
51 52
Topo → B Topo → B
Topo → Topo →
A A A A
pop(pilha)
53 54
53 54
9
Pilhas (representação gráfica) Pilhas (representação gráfica)
Topo → H Topo → H
Topo → G G Topo → G Topo → G G Topo → G
B B B B B B
A A A A A A
Topo → B Topo → B
Topo → Topo → Topo →
A A A A A
Topo →
pop(pilha)
55 56
55 56
57 58
57 58
TPilha
int isfull(TPilha *p) { int isempty(TPilha *p) {
0 1 2 3 4 5 if (p->topo == 5) if (p->topo == -1)
return 1; return 1;
else else
return 0; return 0;
vet topo } }
59 60
59 60
10
Pilhas (isfull e isempty) Pilhas (push e pop)
61 62
63 64
63 64
65 66
11
Pilhas (1º exemplo de utilização) Pilhas (1º exemplo de utilização)
B
int main(void) { int main(void) {
TPilha p; TPilha p;
create(&p); create(&p);
push(&p, 'A'); push(&p, 'A');
push(&p, 'B'); push(&p, 'B');
push(&p, 'C'); push(&p, 'C');
printf("%c\n", pop(&p)); printf("%c\n", pop(&p));
printf("%c\n", pop(&p)); printf("%c\n", pop(&p)); B
return 0; return 0;
}
A }
A
67 68
67 68
69 70
71 72
12
Pilhas (1º exemplo de utilização) Pilhas (2º exemplo de utilização)
void inverte(char s[]) {
Roma
int main(void) { int i, tam;
TPilha p;
TPilha p;
create(&p);
push(&p, 'A'); create(&p);
push(&p, 'B'); tam = strlen(s);
push(&p, 'C'); for (i = 0; i < tam; i++)
printf("%c\n", pop(&p)); push(&p, s[i]);
printf("%c\n", pop(&p));
for (i = 0; !isempty(&p); i++)
return 0;
}
A s[i] = pop(&p);
}
73 74
73 74
75 76
77 78
13
Pilhas (2º exemplo de utilização) Pilhas (2º exemplo de utilização)
void inverte(char s[]) { void inverte(char s[]) {
a
int i, tam; int i, tam;
TPilha p; TPilha p;
create(&p); create(&p);
tam = strlen(s); a tam = strlen(s);
for (i = 0; i < tam; i++) for (i = 0; i < tam; i++)
push(&p, s[i]);
m push(&p, s[i]);
m
for (i = 0; !isempty(&p); i++) o for (i = 0; !isempty(&p); i++) o
s[i] = pop(&p); R s[i] = pop(&p); R
} }
79 80
79 80
81 82
83 84
14
Pilhas (aplicações) Pilhas (aplicações)
Rotina P INSTRUÇÃO ESTADO DA PILHA
Rotina P INSTRUÇÃO ESTADO DA PILHA
e1: A( ); e1: A( );
e0 e0
e2: C( ); e2: C( );
e3: B( ); e3: B( ); e1: A( ); e0
e4: Retorne; e4: Retorne;
Rotina A Rotina A
e5: B( ); e5: B( );
e6: Retorne; e6: Retorne;
Rotina B Rotina B
e7: Retorne; e7: Retorne;
Rotina C Rotina C
e8: Retorne; e8: Retorne;
85 86
85 86
Rotina A Rotina A
e5: B( ); e5: B( );
e6: Retorne; e6: Retorne;
Rotina B Rotina B
e7: Retorne; e7: Retorne;
Rotina C Rotina C
e8: Retorne; e8: Retorne;
87 88
87 88
Rotina B Rotina B
e7: Retorne; e7: Retorne;
Rotina C Rotina C
e8: Retorne; e8: Retorne;
89 90
89 90
15
Pilhas (aplicações) Pilhas (aplicações)
Rotina P INSTRUÇÃO ESTADO DA PILHA
Rotina P INSTRUÇÃO ESTADO DA PILHA
e1: A( ); e1: A( );
e0 e0
e2: C( ); e2: C( );
e3: B( ); e1: A( ); e0, e2 e3: B( ); e1: A( ); e0, e2
e4: Retorne; e5: B( ); e0, e2, e6 e4: Retorne; e5: B( ); e0, e2, e6
e7: Retorne; e0, e2 e7: Retorne; e0, e2
Rotina A e6: Retorne; e0, e2 Rotina A e6: Retorne; e0
e5: B( ); e5: B( );
e2: C( ); e0
e6: Retorne; e6: Retorne;
Rotina B Rotina B
e7: Retorne; e7: Retorne;
Rotina C Rotina C
e8: Retorne; e8: Retorne;
91 92
91 92
Rotina C Rotina C
e8: Retorne; e8: Retorne;
93 94
93 94
Rotina C Rotina C
e8: Retorne; e8: Retorne;
95 96
95 96
16
Pilhas (aplicações) Pilhas (aplicações)
Rotina P INSTRUÇÃO ESTADO DA PILHA
Rotina P INSTRUÇÃO ESTADO DA PILHA
e1: A( ); e1: A( );
e0 e0
e2: C( ); e2: C( );
e3: B( ); e1: A( ); e0, e2 e3: B( ); e1: A( ); e0, e2
e4: Retorne; e5: B( ); e0, e2, e6 e4: Retorne; e5: B( ); e0, e2, e6
e7: Retorne; e0, e2 e7: Retorne; e0, e2
Rotina A e6: Retorne; e0 Rotina A e6: Retorne; e0
e5: B( ); e5: B( );
e2: C( ); e0, e3 e2: C( ); e0, e3
e6: Retorne; e6: Retorne;
e8: Retorne; e0 e8: Retorne; e0
Rotina B e3: B( ); e0, e4 Rotina B e3: B( ); e0, e4
e7: Retorne; e7: Retorne; e0, e4 e7: Retorne; e7: Retorne; e0
e4: Retorne; e0
Rotina C Rotina C
e8: Retorne; e8: Retorne;
97 98
97 98
Rotina B
e7: Retorne;
e8: Retorne;
e3: B( );
e0
e0, e4 Posfixa
e7: Retorne; e0
Rotina C
e8: Retorne;
e4: Retorne;
e0: [volta p/ S.O.]
e0
31−24∗+5/
99 100
99 100
Posfixa: Posfixa:
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe +, -, *, /: empilhe
) : desempilhe e anexe à string ) : desempilhe e anexe à string
101 102
101 102
17
Pilhas (infixa -> posfixa) Pilhas (infixa -> posfixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
Posfixa: Posfixa:
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe +, -, *, /: empilhe
) : desempilhe e anexe à string ) : desempilhe e anexe à string
103 104
103 104
Posfixa: 3 Posfixa: 3
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe
) : desempilhe e anexe à string
− +, -, *, /: empilhe
) : desempilhe e anexe à string
105 106
105 106
Posfixa: 3 1 Posfixa: 3 1 −
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
− +, -, *, /: empilhe
) : desempilhe e anexe à string
+, -, *, /: empilhe
) : desempilhe e anexe à string
107 108
107 108
18
Pilhas (infixa -> posfixa) Pilhas (infixa -> posfixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
Posfixa: 3 1 − Posfixa: 3 1 −
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
109 110
109 110
Posfixa: 3 1 − 2 Posfixa: 3 1 − 2
(
0…9
: ignore
: anexe à string
∗ (
0…9
: ignore
: anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
111 112
111 112
Posfixa: 3 1 − 2 4 Posfixa: 3 1 − 2 4 ∗
∗ (
0…9
: ignore
: anexe à string
(
0…9
: ignore
: anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
+ +, -, *, /: empilhe
) : desempilhe e anexe à string
113 114
113 114
19
Pilhas (infixa -> posfixa) Pilhas (infixa -> posfixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
Posfixa: 3 1 − 2 4 ∗ + Posfixa: 3 1 − 2 4 ∗ +
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe
) : desempilhe e anexe à string
/ +, -, *, /: empilhe
) : desempilhe e anexe à string
115 116
115 116
Posfixa: 3 1 − 2 4 ∗ + 5 Posfixa: 3 1 − 2 4 ∗ + 5 /
( : ignore ( : ignore
0…9 : anexe à string 0…9 : anexe à string
/ +, -, *, /: empilhe
) : desempilhe e anexe à string
+, -, *, /: empilhe
) : desempilhe e anexe à string
117 118
117 118
) : ignore
119 120
119 120
20
Pilhas (infixa -> prefixa) Pilhas (infixa -> prefixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
Prefixa: Prefixa: 5
) : ignore ) : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe +, -, *, /: empilhe
( : desempilhe e anexe à string ( : desempilhe e anexe à string
121 122
121 122
Prefixa: 5 Prefixa: 5
) : ignore ) : ignore
0…9 : anexe à string 0…9 : anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
123 124
123 124
Prefixa: 5 Prefixa: 5 4
) : ignore ) : ignore
0…9 : anexe à string 0…9 : anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
125 126
125 126
21
Pilhas (infixa -> prefixa) Pilhas (infixa -> prefixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
Prefixa: 5 4 Prefixa: 5 4 2
∗ )
0…9
: ignore
: anexe à string
∗ )
0…9
: ignore
: anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
127 128
127 128
Prefixa: 5 4 2 ∗ Prefixa: 5 4 2 ∗
)
0…9
: ignore
: anexe à string
+ )
0…9
: ignore
: anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
129 130
129 130
Prefixa: 5 4 2 ∗ Prefixa: 5 4 2 ∗ 1
+ )
0…9
: ignore
: anexe à string
+ )
0…9
: ignore
: anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
131 132
131 132
22
Pilhas (infixa -> prefixa) Pilhas (infixa -> prefixa)
Infixa: (((3 − 1) + (2 ∗ 4))/5) Infixa: (((3 − 1) + (2 ∗ 4))/5)
− Prefixa: 5 4 2 ∗ 1
− Prefixa: 5 4 2 ∗ 1 3
+ )
0…9
: ignore
: anexe à string
+ )
0…9
: ignore
: anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
133 134
133 134
Prefixa: 5 4 2 ∗ 1 3 − Prefixa: 5 4 2 ∗ 1 3 − +
+ )
0…9
: ignore
: anexe à string
)
0…9
: ignore
: anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
/ +, -, *, /: empilhe
( : desempilhe e anexe à string
135 136
135 136
Prefixa: 5 4 2 ∗ 1 3 − + / Prefixa: / + − 3 1 ∗ 2 4 5
) : ignore ) : ignore
0…9 : anexe à string 0…9 : anexe à string
+, -, *, /: empilhe +, -, *, /: empilhe
( : desempilhe e anexe à string ( : desempilhe e anexe à string
137 138
137 138
23
Pilhas (posfixa -> infixa) Pilhas (posfixa -> infixa)
Posfixa: 3 1 − 2 4 ∗ + 5 /
Posfixa
31−24∗+5/ Infixa:
0…9 : empilhe
139 140
139 140
Infixa: Infixa:
141 142
141 142
Infixa:
143 144
143 144
24
Pilhas (posfixa -> infixa) Pilhas (posfixa -> infixa)
Posfixa: 3 1 − 2 4 ∗ + 5 / Posfixa: 3 1 − 2 4 ∗ + 5 /
Infixa: Infixa:
145 146
145 146
Infixa: Infixa:
147 148
147 148
149 150
149 150
25
Pilhas (prefixa -> infixa) Pilhas (prefixa -> infixa)
Prefixa: / + − 3 1 ∗ 2 4 5
Prefixa
Infixa:
/+−31∗245
0…9 : empilhe
151 152
151 152
Infixa: Infixa:
153 154
153 154
Infixa: Infixa:
155 156
155 156
26
Pilhas (prefixa -> infixa) Pilhas (prefixa -> infixa)
Prefixa: / + − 3 1 ∗ 2 4 5 Prefixa: / + − 3 1 ∗ 2 4 5
Infixa: Infixa:
3
1 0…9 : empilhe 1 0…9 : empilhe
(2 ∗ 4) (2 ∗ 4)
+, -, *, /: empilhe '(' + +, -, *, /: empilhe '(' +
5 5
desempilha + [𝑜𝑝𝑒𝑟𝑎𝑑𝑜𝑟] + desempilha + [𝑜𝑝𝑒𝑟𝑎𝑑𝑜𝑟] +
desempilha + ')' desempilha + ')'
157 158
157 158
Infixa: Infixa:
159 160
159 160
161 162
161 162
27
Pilhas (avaliação posfixa)
AVALIAÇÃO DE EXPRESSÃO
posfixa: 3 1 − 2 4 ∗ + 5 /
POSFIXA Resultado:
0…9 : empilhe
31−24∗+5/
+, -, *, /: 𝑏 recebe desempilha;
empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
163 164
163 164
Resultado: Resultado:
0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
1 0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
3 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
3 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
165 166
165 166
Resultado: Resultado:
0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
2 0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
2 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
2 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
167 168
167 168
28
Pilhas (avaliação posfixa) Pilhas (avaliação posfixa)
posfixa: 3 1 − 2 4 ∗ + 5 / posfixa: 3 1 − 2 4 ∗ + 5 /
4 Resultado: Resultado:
2 0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
8 0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
2 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
2 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
169 170
169 170
Resultado: Resultado:
0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
5 0…9 : empilhe
+, -, *, /: 𝑏 recebe desempilha;
10 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
10 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
171 172
171 172
Resultado: Resultado: 2
2 empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
empilhe(
desempilha [𝑜𝑝𝑒𝑟𝑎çã𝑜] 𝑏)
173 174
173 174
29
Pilhas (avaliação prefixa)
AVALIAÇÃO DE EXPRESSÃO
prefixa: / + − 3 1 ∗ 2 4 5
PREFIXA Resultado:
0…9 : empilhe
+, -, *, /: empilhe(desempilha
175 176
175 176
Resultado: Resultado:
177 178
Resultado: Resultado:
179 180
30
Pilhas (avaliação prefixa) Pilhas (avaliação prefixa)
prefixa: / + − 3 1 ∗ 2 4 5 prefixa: / + − 3 1 ∗ 2 4 5
Resultado: 3 Resultado:
1 0…9 : empilhe
1 0…9 : empilhe
8 +, -, *, /: empilhe(desempilha 8 +, -, *, /: empilhe(desempilha
[𝑜𝑝𝑒𝑟𝑎çã𝑜] desempilha) [𝑜𝑝𝑒𝑟𝑎çã𝑜] desempilha)
5 5
181 182
181 182
Resultado: Resultado:
183 184
Resultado: Resultado: 2
185 186
31