Estrutura de dados - análise de expressão
A forma de escrever expressões aritméticas é conhecida como notation. Uma expressão aritmética pode ser escrita em três notações diferentes, mas equivalentes, ou seja, sem alterar a essência ou a saída de uma expressão. Essas notações são -
- Notação Infix
- Notação de prefixo (polonês)
- Notação Postfix (polonês reverso)
Essas notações são nomeadas como usam o operador na expressão. Devemos aprender o mesmo aqui neste capítulo.
Notação Infix
Nós escrevemos expressão em infix notação, por exemplo, a - b + c, onde os operadores são usados in-entre operandos. É fácil para nós, humanos, ler, escrever e falar em notação infixa, mas o mesmo não funciona bem com dispositivos de computação. Um algoritmo para processar notação de infixação pode ser difícil e caro em termos de consumo de tempo e espaço.
Notação de prefixo
Nesta notação, o operador é prefixed para operandos, ou seja, o operador é escrito antes dos operandos. Por exemplo,+ab. Isso é equivalente à sua notação infixaa + b. A notação de prefixo também é conhecida comoPolish Notation.
Notação Postfix
Este estilo de notação é conhecido como Reversed Polish Notation. Neste estilo de notação, o operador épostfixed para os operandos, ou seja, o operador é escrito após os operandos. Por exemplo,ab+. Isso é equivalente à sua notação infixaa + b.
A tabela a seguir tenta mostrar brevemente a diferença em todas as três notações -
Sr. Não. | Notação Infix | Notação de prefixo | Notação Postfix |
---|---|---|---|
1 | a + b | + ab | ab + |
2 | (a + b) ∗ c | ∗ + abc | ab + c ∗ |
3 | a ∗ (b + c) | ∗ a + bc | abc + ∗ |
4 | a / b + c / d | + / ab / cd | ab / cd / + |
5 | (a + b) ∗ (c + d) | ∗ + ab + cd | ab + cd + ∗ |
6 | ((a + b) ∗ c) - d | - ∗ + abcd | ab + c ∗ d - |
Análise de expressões
Como discutimos, não é uma maneira muito eficiente de projetar um algoritmo ou programa para analisar notações infixas. Em vez disso, essas notações infixadas são primeiro convertidas em notações pós-fixadas ou prefixadas e depois calculadas.
Para analisar qualquer expressão aritmética, precisamos cuidar também da precedência do operador e da associatividade.
Precedência
Quando um operando está entre dois operadores diferentes, qual operador assumirá o operando primeiro, é decidido pela precedência de um operador sobre os outros. Por exemplo -
Como a operação de multiplicação tem precedência sobre a adição, b * c será avaliado primeiro. Uma tabela de precedência de operador é fornecida posteriormente.
Associatividade
A associatividade descreve a regra em que os operadores com a mesma precedência aparecem em uma expressão. Por exemplo, na expressão a + b - c, ambos + e - têm a mesma precedência, então qual parte da expressão será avaliada primeiro, é determinada pela associatividade desses operadores. Aqui, + e - são associativos à esquerda, então a expressão será avaliada como(a + b) − c.
A precedência e a associatividade determinam a ordem de avaliação de uma expressão. A seguir está uma tabela de precedência e associatividade do operador (da mais alta para a mais baixa) -
Sr. Não. | Operador | Precedência | Associatividade |
---|---|---|---|
1 | Exponenciação ^ | Altíssima | Associativo certo |
2 | Multiplicação (∗) e divisão (/) | Segundo mais alto | Esquerda Associativa |
3 | Adição (+) e subtração (-) | Mais baixo | Esquerda Associativa |
A tabela acima mostra o comportamento padrão dos operadores. Em qualquer ponto do tempo na avaliação da expressão, a ordem pode ser alterada usando parênteses. Por exemplo -
No a + b*c, a parte da expressão b*cserão avaliados primeiro, com a multiplicação como precedência sobre a adição. Aqui usamos parênteses paraa + b para ser avaliado primeiro, como (a + b)*c.
Algoritmo de avaliação Postfix
Devemos agora olhar para o algoritmo sobre como avaliar a notação pós-fixada -
Step 1 − scan the expression from left to right
Step 2 − if it is an operand push it to stack
Step 3 − if it is an operator pull operand from stack and perform operation
Step 4 − store the output of step 3, back to stack
Step 5 − scan the expression until all operands are consumed
Step 6 − pop the stack and perform operation
Para ver a implementação na linguagem de programação C, clique aqui .