You are on page 1of 38

Estrutura de Dados

Parte III Pilhas (com ponteiros)

Pilhas com Alocao Dinmica de Memria

Pilhas com Alocao Dinmica de Memria

Pilhas com Alocao Dinmica de Memria

Pilhas com Alocao Dinmica de Memria

Pilhas com Alocao Dinmica de Memria

Entendendo o Cdigo

Entendendo o Cdigo
Os campos topo e base da estrutura TPilha so ponteiros para TElemento. Ambos apontam para uma rea de memria que armazene uma estrutura de TElemento. TElemento apresenta trs campos:

valor (do tipo inteiro); acima (ponteiro para TElemento); abaixo (ponteiro para TElemento).

Entendendo o Cdigo
Existe uma varivel global de nome pilha que do tipo TPilha. Por enquanto no h uma varivel de tipo TElemento. A funo inicPilha( ) responsvel por deixar a pilha vazia pronta para que comecemos a empilhar variveis annimas do tipo TElemento.

Entendendo inicPilha( )

A passagem de parmetros por referncia: p um ponteiro para TPilha.

No programa principal (main( )) a chamada a essa funo inicPilha(&pilha).


Note que pilha a varivel global declarada anteriormente (do tipo TPilha). O & esquerda do nome da varivel pilha significa que o endereo da varivel global est sendo repassado para a funo. O parmetro p recebe esse endereo na funo.

Entendendo inicPilha( )
O comando p->topo = NULL; deve ser lido da seguinte maneira: o campo topo, apontado por p, recebe NULO. O valor NULO significa que o ponteiro topo no aponta para nenhum endereo de memria. O mesmo ocorre com base, que no aponta para nenhum endereo de memria.

Entendendo pilhaVazia( )

Se o campo topo de pilha estiver NULO (= = NULL) a pilha encontra-se vazia e a funo pilhaVazia( ) retorna o valor 1 (qualquer valor diferente de zero verdadeiro). Caso contrrio se topo no for NULO, mas apontar para algum endereo a funo retorna 0 (= = FALSE).

Entendendo empilha( )

A funo empilha( ) no retorna qualquer valor (void), mas recebe dois parmetros de entrada: (1) p que um ponteiro para TPilha, e (2) numero que varivel do tipo inteiro. Uma possvel chamada dessa funo a partir do main( ) poderia ser empilha(&pilha, 35). O comando malloc aloca dinamicamente um segmento de memria e armazena seu endereo no ponteiro novo (que aponta para TElemento).

Entendendo empilha( )

O campo valor apontado por novo recebe 35. Se a pilha apontada por p estiver vazia: O campo topo apontado por p recebe novo (aponta para novo). O campo base apontado por p recebe novo (aponta para novo). O campo abaixo apontado por novo recebe NULL.

Entendo empilha( )

Agora suponha que a funo foi concluda (o campo acima anteriormente apontado por novo recebe NULL) e novo deixa de apontar para o elemento de valor 35. Ento ocorre uma outra chamada funo: empilha(&pilha, 68);. Um novo segmento de memria alocado junto ao sistema operacional e seu endereo inicial armazenado no ponteiro novo.

Entendendo empilha( )

O campo acima apontado por topo (por sua vez apontado por p) o elemento de valor 35 aponta para novo. O campo abaixo apontado por novo (elemento de valor 68) aponta para o mesmo endereo que topo apontado por p (elemento de valor 35). O campo topo apontado por p deixa de apontar para elemento de valor 35 e passa a apontar para o elemento apontado por novo (de valor 68). O campo acima apontado por novo (elemento de valor 68) recebe NULL (no aponta para ningum).

Situao Hipottica para a Pilha

Entendendo desempilha( )

A funo desempilha( ) retorna um ponteiro para TElemento e recebe como parmetro de entrada o ponteiro p (que aponta para TPilha). Um ponteiro para TElemento declarado com o nome desempilhado e inicializado com o valor NULL (no aponta para ningum).

Entendendo desempilha( )

Se a pilha NO(!) est VAZIA ento: o ponteiro desempilhado (varivel local da funo) recebe novo (aponta para o mesmo endereo que novo). o ponteiro topo de TPilha apontado por p aponta para o mesmo endereo que o campo abaixo apontado por novo: o Elemento de valor 68 passa a ser o novo topo da PILHA.

Entendendo desempilha( )

Como o topo da pilha apontada por p NO NULL: o campo acima apontado por topo (do Elemento de valor 68) recebe NULL (deixa de apontar para o Elemento de valor 21).

O ponteiro desempilhado retornado pela funo e ele aponta para o Elemento de valor 21.

Entendendo desempilha( )

No programa principal (main( )), o ponteiro (para TElemento) descartado recebe da funo desempilha( ) o elemento de valor 21. Se ponteiro descartado NO for NULL (o que exatamente o caso: ele aponta para 21): O contedo do campo valor apontado por descartado exibido em tela atravs do printf( ). O endereo de memria onde est armazenado o elemento de valor 21 devolvido ao sistema operacional atravs da funo free( ).

Entendendo elemTopo( ) e menu( )

Exerccio Resolvido - 1
Uma utilizao clssica das pilhas a converso e a avaliao de expresses algbricas. A converso refere-se possibilidade de converter uma expresso na notao infixa para a notao ps-fixa ou prfixa.

Exerccio Resolvido 1 (cont.)

A avaliao significa a possibilidade de resolver a expresso algbrica para determinados valores para as variveis que compem a expresso.

Para efeito de simplificao, as expresses aqui sero montadas exclusivamente com operandos de uma nica letra maiscula pertencente ao conjunto {A ... Z}.

Exerccio Resolvido - 1

Os operadores aritmticos pertencem ao conjunto {+, -, *, /, ^} e tm os respectivos significados:


Adio, Subtrao, Multiplicao, Diviso e Potenciao.

Exerccio Resolvido - 1
Ser utilizado apenas uma combinao dos parnteses de abertura ( e de fechamento ) para compor expresses mais sofisticadas. Exemplos de expresses:

AB A B*C A / (B * (C D) + E) ((A / B) * (C D) + E)

Exerccio Resolvido - 1
Para resolver uma expresso matemtica devemos considerar a prioridade dos operadores, chamada de precedncia. As operaes de multiplicao e de diviso tm prioridade sobre as operaes de soma e de subtrao.

Exerccio Resolvido - 1
No caso de operadores de mesma prioridade (precedncia), os clculos sero efetuados na ordem em que aprecem na expresso. Os parnteses podem alterar totalmente a ordem de precedncia. Afinal, A * B + C produz um resultado diferente de A * (B + C).

Exerccio Resolvido - 1

O matemtico polons Jan Lukasiewics elaborou uma sada para representarmos e avaliarmos expresses sem nos preocuparmos com as prioridades das operaes e at mesmo abrir mo dos parnteses.

Exerccio Resolvido - 1

Exemplo: AB*C
Colocar manualmente parnteses na expresso tornando explcita a prece3dncia das operaes que antes estava implcita. A (B * C)

A multiplicao (*) tem precedncia sobre a subtrao ( ), a no ser que a colocao proposital de parnteses altere a precedncia padro das operaes.

Exerccio Resolvido - 1

Percorrer a expresso j com parnteses, da esquerda para a direita, e para cada smbolo (caractere) encontrado ao longo da expresso, tomar a seguinte deciso: Se for parntese de abertura, ignor-lo; Se for operando, copi-lo para a expresso ps-fixa (sada desejada); Se for operador, coloc-lo na pilha; Se for parntese de fechamento, desempilhar o operador presente no topo da pilha.

Ao final deste processo, caso a pilha no esteja vazia, um sinal de que algo de errado ocorreu durante a converso da notao infixa para ps-fixa.

Exerccio Resolvido - 1

Converso

Exerccio Resolvido - 1

Exerccio Resolvido - 1

Exerccio Resolvido - 1

Exerccio Resolvido - 1

Exerccio Resolvido - 1

Exerccio Resolvido - 1

Implemente esse algoritmo de converso de uma notao infixa em ps-fixa. Codifique-o na linguagem C.

You might also like