Professional Documents
Culture Documents
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( )
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).
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( ).
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.
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
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.