Contato

  • Jean Paulo Martins (jeanmartins utfpr edu br)
  • Sala 105, Bloco S (UTFPR - Campus Pato Branco)

Conteúdo

Introdução

Considere a soma de A mais B, numa expressão $A+B$. Neste exemplo, $+$ é um operador sendo aplicado aos operandos $A,B$. Este tipo de representação para a expressão de soma dos dois operandos é chamada infixa, pois o operador se posiciona entre os operandos.

Considerando-se o posicionamento do operador, no entando, existem duas representações alternativas: prefixa e posfixa.

  • +AB (prefixa)
  • AB+ (posfixa)

Input Format

Uma string contendo operandos (dígitos 0-9) e operandos (+,-,/,^,*) na forma posfixa. O operador exponenciação é indicado pelo caracter ‘^’, e pode ser implementado pela função:

#include <math.h>
// Exponenciação, é representada por AB^ (posfixa) => A^B (infixa) 
double r = pow(A, B);

A string pode conter espaços, os quais devem ser ignorados. As seguintes funções podem ser utilizadas para verificar o tipo de um caracter char c.

Motivação

Como poderá ser notado, notações prefixa e posfixa removem a ambiguidade de uma expressão, desta forma, parenteses não são mais necessários.

Notação préfixa

Para compreendermos a utilidade das notações prefixa e posfixa, consideremos as demais operações definidas como funções:

int add(int A, int B);
int mult(int A, int B);
int div(int A, int B);	

Dada uma expressão de exemplo, definida como:

Ela seria implementada em uma chamada da seguinte forma:

mult(add(A, div(B,C)),D);

O que utilizando a notação prefixa em termos de , avalia-se a expressão acima, considerando-se as operações que serão efetuadas em primeiro lugar, ou seja, neste caso:

  1. divisão ,
  2. adição ,
  3. multiplicação .

Para comprovarmos se essa expressão se equivale à forma infixa, performe as operações assim que dois operandos estiverem disponíveis, iniciando a avaliação da esquerda para a direita.

Ao compararmos as duas representações para a expressão, o que é visivelmente notável?

Parenteses se tornam desnecessários! Como consequência, avaliar o resultado de uma expressão se torna muito mais simples. De fato pode ser implementado lendo-se a expressão apenas uma vez.

Notação pósfixa

Tanto na notação préfixa quanto na pósfixa, é importante lembrar que os operadores com precedência devem ser avaliados/convertidos primeiro, a não ser que uma possível parentização altere a ordem de precedência.

No exemplo anterior , a multiplicação é efetuado somente ao final, devido à parentização. A ausência de parênteses, nesse exemplo, nos permitiria outras interpretações:

A forma pósfixa é a contrapartida da prefixa, em que os operadores são posicionados após os operandos. Retornando ao exemplo original , temos que a divisão deve ser convertida em primeiro lugar:

Em seguida a adição entre parênteses

Por fim, a multiplicação

Utilidade

Dada a expressão em forma infixa, elabore um algoritmo que dê o resultado da expressão em apenas uma leitura da string:

Dada a expressão em forma pósfixa, elabore um algoritmo que dê o resultado da expressão em apenas uma leitura da string:

Conversão infixa/pósfixa

Forma infixa Forma pósfixa
A+ B AB+
A+B-C AB+C-
(A+B) * C AB+C*
A+(B*C) ABC*+
(A+B)*(C-D) AB+CD-*
((A+B)*C - (D-E))^(F+G) AB+C*DE- -FG+^

Avaliação de expressão pósfixa