Você está na página 1de 6

Centro Federal de Educao Tecnolgica do Esprito Santo Unidade de Ensino Descentralizada de Colatina Tecnlogo em Redes de Computadores

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:

O elemento 3 dever ser desalocado.

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);

{*** Imprime: F ***} ***}

{*** Imprime: E D C B A {*** Imprime: D C B A {*** Imprime: C B A

***} ***}

pt := ObterTopo(P); IF ( pt <> nil ) THEN writeln(pt^.info.nome); Destruir(P); readkey; END.

{*** Imprime: C ***}

{*** No esquea de destruir a Pilha ***}

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.