Escolar Documentos
Profissional Documentos
Cultura Documentos
Pilhas C
Pilhas C
Pilhas
Prof. Ricardo J. G. B. Campello
Crditos
Parte dos slides a seguir so adaptaes,
extenses e tradues para C dos originais:
disponveis em http://ww3.datastructures.net/
Pilhas
D
C
B
A
TOPO
BASE
O TAD PILHA
Uma Pilha armazena elementos
de um ou mais tipos
Operaes auxiliares:
Aplicaes de Pilhas
Aplicaes diretas:
Aplicaes indiretas:
main() {
int i = 5;
foo(i);
}
foo(int j) {
int k;
k = j+1;
bar(k);
}
bar(int m) {
bar
PC = 1
m=6
foo
PC = 3
j=5
k=6
main
PC = 2
i=5
6
Algoritmo pop(P):
se pilha_vazia(P) ento
retorne nulo
seno
P.topo P.topo 1
retorne P.S[P.topo + 1]
Adicionamos elementos a
partir do incio do arranjo.
Uma varivel topo guarda
informao sobre a posio
do elemento do topo :
Algoritmo push(x, P)
se pilha_cheia(P) ento
retorne false
seno
P.topo P.topo + 1
P.S[P.topo] x
retorne true
S
1
topo
typedef struct {
Tipo_1 chave;
Tipo_2 info;
} tipo_elem;
typedef struct {
int topo;
tipo_elem S[MAX+1]; } Pilha;
Pilha P;
/* Tipo da Pilha */
/* Exemplo de Declarao */
8
/* Clula no utilizada */
P->S[0].info[0] = '\0';
/* Clula no utilizada */
} /* O(1) */
bool pilha_vazia(Pilha *P){
return (P->topo == 0);
} /* O(1) */
int size(Pilha *P){
return P->topo;
} /* O(1) */
9
/* pilha cheia! */
else {
P->topo++;
P->S[P->topo] = x;
return TRUE;
}
}
/* O(1) */
10
/* elemento invlido */
x.info[0] = '\0';
/* elemento invlido */
}
else x = P->S[P->topo];
return x;
}
/* O(1) */
11
/* elemento invlido */
x.info[0] = '\0';
/* elemento invlido */
}
else {
x = P->S[P->topo];
P->topo--; }
return x;
}
/* O(1) */
12
Desempenho e Limitaes
Desempenho:
Limitao:
Implementao Encadeada
Para eliminar a necessidade de prever o tamanho mx.
da pilha, utiliza-se uma implementao dinmica.
Encadeamento simples suficiente:
topo
A
14
Implementao Encadeada
Por simplicidade, implementaremos a pilha usando a
implementao simplesmente encadeada do TAD Lista
typedef struct {
Lista *Lis_din;
} Pilha;
15
Implementao Encadeada
Pilha *define(void){
Pilha *P;
P = malloc(sizeof(Pilha));
(P->Lis_din) = Definir();
return P;
}
/* O(1), pois Definir O(1) */
16
Implementao Encadeada
int size(Pilha *P){
return Tamanho(P->Lis_din);
} /* O(1), pois Tamanho O(1) */
bool pilha_vazia(Pilha *P){
return Lista_vazia(P->Lis_din);
} /* O(1), pois Lista_vazia O(1) */
Implementao Encadeada
void push(tipo_elem x, Pilha *P){
Inserir_frente(x, P->Lis_din);
}
18
Implementao Encadeada
tipo_elem top(Pilha *P){
if (!pilha_vazia(P))
return Elemento(P->Lis_din->head);
else printf("Pilha Vazia!!!");
}
19
mais simples
Implementao dinmica:
muito varivel
20
10
Exemplo de Aplicao
Por exemplo: A * B - C / D = ?
Exemplo de Aplicao
22
11
Exemplo de Aplicao
Algoritmo (Avaliao de Expresses)
23
Exemplo de Aplicao
Expresso: A B / D E * + A -
24
12
Exerccios
1.
2.
25
Bibliografia
A. M. Tenembaum et al., Data Structures Using C,
Prentice-Hall, 1990
M. T. Goodrich & R. Tamassia, Data Structures and
Algorithms in C++/Java, John Wiley & Sons,
2002/2005
N. Ziviani, Projeto de Algoritmos, Thomson, 2a.
Edio, 2004
J. L. Szwarcfiter & L. Markenzon, Estruturas de
Dados e seus Algoritmos, LTC, 1994
Schildt, H. "C Completo e Total", 3a. Edio,
Pearson, 1997
26
13