segunda-feira, 18 de março de 2013

Avaliando uma expressão infixa.


Com as duas ultimas postagens discutindo uma metodologia para o calculo de expressão pós-fixa, amplia-se o senso de continuidade no assunto com o reaproveitamento do material elaborado, tornando o estudo atual em um caso de transformar uma expressão infixa em pós-fixa.

Um ponto importante a ser implementado nesta conversão é a prioridade do operador em uma expressão infixa e como o parêntese altera em qual ordem a operação irá ser executado.

O tratamento da precedência deverá seguir a tabela apresentado anteriormente e incluir parênteses no tratamento, considere uma função prcd(opr1, opr2)  cujo resultado determina a ação a ser tomada, aonde opr1  e opr2 são operadores na expressão, sempre que a precedência de opr1 for maior ou igual que opr2, retorna VERDADE, do contrario sendo menor, retorna FALSO, no exemplo abaixo temos a seguinte situação:

INFIXA
PÓS-FIXA
X + Y * Z
X Y Z * +
( X + Y ) * Z
X Y + Z *

               Em ambos os casos, a ordem dos operando se manteve, uma decisão deve ser feita quando surgir um operador,  guarda-se o mesmo em uma pilha  e continua-se montando a pós-fixa, no próximo operador a ser encontrado, este será comparado com o valor armazenado para definir a precedência da operação, para o controle de armazenamento dos dados será utilizada a pilha, que será esvaziada quando o símbolo de maior precedência for encontrado.

passo
símbolo
conversão
Pilha
1
X
X

2
+
X
+
3
Y
X Y
+
4
*
X Y
+, *
5
Z
X Y Z
+, *
6

X Y Z *
+
7

X Y Z * +






               No tratamento de parênteses a regra a ser incluída consiste em armazenar o parêntese esquerdo na pilha até encontrar um parêntese direito, retirar os operadores da pilha até encontrar o parêntese esquerdo armazenado.

passo
símbolo
conversão
pilha
1
(

(
2
X
X
(
3
+
X
(, +
4
Y
X Y
(, +
5
)
X Y +

6
*
X Y +
*
7
Z
X Y + Z
*
8

X Y + Z *
+









Caso o processo de conversão do algoritmo lhe pareça confuso, repare que o método de conversão trabalha de dentro para fora, sempre selecionando o conteúdo dos parênteses primeiro, semelhante maneira que seria dada a resposta em formato manual, ao invés de usar lápis e papel para lembrar a ordem dos operadores, utilizamos a pilha para armazenar o operador de menor prioridade.

Todo o código em linguagem C para avaliar uma expressão infixa utilizando pilhas está incluído na próxima postagem "Rotinas para infixa" que completa o tema sobre analise de expressões.

Nenhum comentário:

Postar um comentário