Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PROGRAMAO II
Prof. Jean Eduardo Glazar
3. PILHA DINMICA
Uma pilha um tipo especial de Pilha na quais todas as inseres e remoes so feitas na primeira posio, que chamada de topo. Outro nome para pilha LIFO (Last In First Out). Um modelo intuitivo de uma pilha , por exemplo, uma pilha de pratos dentro de uma caixa bem estreita, de modo que se quisermos pegar um prato do meio deveremos desempilhar os pratos de cima um a um ou se quisermos acrescentar pratos deveremos empilh-los um a um. Veja o desenho abaixo.
PRINCIPAIS FUNES CriarPilha Inicia a pilha vazia. CriarNodoPilha Aloca memria para um novo nodo e retorna o seu apontador. ObterTopo Obtm o elemento do topo da pilha sem desempilhar. Desempilhar Obtm o elemento do topo da pilha desempilhando. Empilhar Insere um elemento no topo da pilha. PilhaVazia Retorna verdadeiro se pilha vazia e falso caso contrrio. Imprimir Imprime a pilha. Destruir Destroi a pilha, liberando a memria dos nodos. Passaremos agora para a implementao do TAD Pilha atravs de alocao dinmica. Pilha para ns agora, ser um ponteiro que aponta sempre para o nodo que se encontra no topo da pilha. Cada nodo ter um elemento prximo que aponta para o nodo abaixo na pilha.
Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores A pilha vazia ser representada pelo topo apontando para NULL.
Ao empilhar um novo nodo, o topo passar a apontar para este nodo e o prximo do novo nodo ser o antigo topo. Inserindo o elemento 5:
Inserindo o elemento 3:
Ao desempilhar, o topo passar a apontar para o prximo elemento da pilha (topo:=topo^.prox). Desempilhando:
Veja a mudana da estrutura de dados e das funes abaixo. Definio TYPE Informacao = RECORD { Conteudo de cada posio da pilha, por exemplo: nome, cpf, telefone, etc ... } END; TYPE Ponteiro = ^NodoPilha;
Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores TYPE NodoPilha = RECORD info : Informacao; prox : Ponteiro; END; TYPE Pilha = RECORD topo : Ponteiro; { Topo da pilha} tamanho : INTEGER; { Tamanho da Pilha } END; ALGUMAS IMPLEMENTAES: {###### Inicializar a pilha vazia ######} { Prximo elemento }
procedure CriarPilha ( var P : Pilha); begin P.topo := NIL; { Pilha vazia. Apontador aponta para nada} P.tamanho := 0; end; {###### Retorna TRUE se a Pilha estiver vazia ####### e FALSE caso contrario ##### ##### }
FUNCTION PilhaVazia ( VAR P : Pilha ) : BOOLEAN; BEGIN IF ( P.topo = NIL ) THEN PilhaVazia := TRUE ELSE PilhaVazia := FALSE; END; {###### {###### {###### Aloca memria para um determinado NODO e ######} retorna o apontador para este NODO. Se no for possvel } alocar memria, retorna NIL ######}
FUNCTION CriarNodoPilha ( e : informacao ) : Ponteiro; VAR aux : Ponteiro; BEGIN IF MaxAvail < SIZEOF(NodoPilha) { ** Testa se existe memria *} THEN BEGIN WRITELN(No existe memria suficiente); CriarNodoPilha := NIL; END ELSE BEGIN NEW(aux); aux^.info := e; {** Copiar todo o registro de E para INFO} CriarNodoPilha := aux; END; END;
Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores { #### Empilhar o NOVO nodo no TOPO da pilha ####} { #### O NOVO nodo deve ter sido criado com a funo CriarNodo ####} PROCEDURE Empilhar (VAR P : Pilha; novo : Ponteiro); BEGIN IF novo = NIL THEN BEGIN WRITELN(No existe nodo para inserir); END ELSE BEGIN novo^.prox := P.topo; P.topo := novo; P.tamanho := P.tamanho + 1; END END; { #### Desempilha o elemento do TOPO da pilha { #### e libera a memria ####} ####}
PROCEDURE Desempilhar(VAR P : Pilha); VAR aux : Ponteiro; BEGIN IF ( PilhaVazia(P) ) THEN WRITELN('Pilha Vazia') ELSE BEGIN aux := P.topo; P.topo := P.topo^.prox; { Remover o primeiro } DISPOSE(aux); P.tamanho := P.tamanho 1; END; END; No podemos esquecer de destruir toda a Pilha, ou seja, desalocar todos os elementos antes do nosso programa terminar. Para isso, vamos criar a funo Destruir, que ir percorrer toda a Pilha eliminando cada elemento. { #### Destroi a Pilha liberando a memria ####} { #### Percorre a Pilha desempilhando o topo ####} PROCEDURE Destruir (VAR P : Pilha); BEGIN WHILE ( NOT PilhaVazia(P) ) DO BEGIN Desempilhar(P); {*** Desempilha o topo ***} END; END; As demais funes ficam como exerccios.
Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores {*** Vejamos agora o programa principal utilizando esta Pilha {*** Declarao ***} VAR P : Pilha; el : informacao; pt : Ponteiro; {*** Programa principal ***} BEGIN CriarPilha(P); el.nome := 'A'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'B'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'C'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'D'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'E'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'F'; Empilhar(P, CriarNodoPilha(el) ); el.nome := 'G'; Empilhar(P, CriarNodoPilha(el) ); Imprimir(P); {*** Imprime: G F E D C B A Desempilhar(P); Imprimir(P); {*** Imprime: F E D C B A ***}
***}
***}
pt := ObterTopo(P); IF ( pt <> nil ) THEN writeln(pt^.info.nome); Desempilhar(P); Imprimir(P); Desempilhar(P); Imprimir(P); Desempilhar(P); Imprimir(P);
***} ***}
Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores A vantagem de se utilizar pilha por vetor a simplicidade de implement-la. A desvantagem que tem tamanho limitado. Ento, depender da sua necessidade. Se for certo que a pilha a utilizar no crescer mais que um determinado tamanho conhecido, ento pode-se perfeitamente utilizar uma pilha por vetores. Se, no entanto, a pilha puder crescer indefinidamente, a melhor opo ser utilizar pilha por alocao dinmica. EXERCCIOS: 1) Implemente as funes que esto faltando. 2) Considere a implementao da Pilha utilizando a alocao dinmica: a) Represente a Pilha vazia e aps cada insero dos elementos 8, 4, 5, 3 e 9. b) Represente a Pilha aps desempilhar um elementos. c) Represente a Pilha aps desempilhar mais um elementos. d) Escreva uma rotina em C para imprimir a Pilha. e) Escreva uma rotina em C para esvaziar a Pilha. 3) Faa um programa em C para converter um nmero decimal em binrio, utilizando uma pilha de inteiros para empilhar os restos das divises por dois, necessrias para a converso.
4) Escreva um programa que verifique que expresses aritmticas esto com a
parentizao correta. Guarde o resultado numa pilha tambm. Seu programa deve checar expresses para ver se cada "abre parnteses" tem um "fecha parnteses" correspondente.