Estructura de datos: análisis de expresiones

La forma de escribir una expresión aritmética se conoce como notation. Una expresión aritmética se puede escribir en tres notaciones diferentes pero equivalentes, es decir, sin cambiar la esencia o la salida de una expresión. Estas notaciones son:

  • Notación infija
  • Notación de prefijo (polaco)
  • Notación de sufijo (polaco inverso)

Estas notaciones se denominan según la forma en que usan el operador en la expresión. Aprenderemos lo mismo aquí en este capítulo.

Notación infija

Escribimos expresión en infix notación, por ejemplo, a - b + c, donde se utilizan operadores in-entre operandos. Es fácil para nosotros, los humanos, leer, escribir y hablar en notación infija, pero lo mismo no va bien con los dispositivos informáticos. Un algoritmo para procesar la notación infija podría ser difícil y costoso en términos de consumo de tiempo y espacio.

Notación de prefijo

En esta notación, el operador es prefixed a operandos, es decir, el operador se escribe antes que los operandos. Por ejemplo,+ab. Esto es equivalente a su notación infijaa + b. La notación de prefijo también se conoce comoPolish Notation.

Notación de sufijo

Este estilo de notación se conoce como Reversed Polish Notation. En este estilo de notación, el operador espostfixed a los operandos, es decir, el operador se escribe después de los operandos. Por ejemplo,ab+. Esto es equivalente a su notación infijaa + b.

La siguiente tabla trata de mostrar brevemente la diferencia en las tres notaciones:

No Señor. Notación infija Notación de prefijo Notación de sufijo
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 -

Analizar expresiones

Como hemos comentado, no es una forma muy eficiente de diseñar un algoritmo o programa para analizar notaciones infijas. En cambio, estas notaciones infijas se convierten primero en notaciones sufijas o prefijas y luego se calculan.

Para analizar cualquier expresión aritmética, también debemos tener en cuenta la precedencia de los operadores y la asociatividad.

Precedencia

Cuando un operando está entre dos operadores diferentes, qué operador tomará el operando primero, se decide por la precedencia de un operador sobre otros. Por ejemplo

Como la operación de multiplicación tiene prioridad sobre la suma, primero se evaluará b * c. Más adelante se proporciona una tabla de precedencia de operadores.

Asociatividad

La asociatividad describe la regla en la que los operadores con la misma precedencia aparecen en una expresión. Por ejemplo, en la expresión a + b - c, tanto + como - tienen la misma precedencia, entonces qué parte de la expresión se evaluará primero, está determinada por la asociatividad de esos operadores. Aquí, tanto + como - son asociativos a la izquierda, por lo que la expresión se evaluará como(a + b) − c.

La precedencia y la asociatividad determinan el orden de evaluación de una expresión. A continuación se muestra una tabla de precedencia y asociatividad de operadores (de mayor a menor):

No Señor. Operador Precedencia Asociatividad
1 Exponenciación ^ Más alto Asociativo derecho
2 Multiplicación (∗) y división (/) Segundo más alto Asociativo izquierdo
3 Suma (+) y resta (-) Más bajo Asociativo izquierdo

La tabla anterior muestra el comportamiento predeterminado de los operadores. En cualquier momento de la evaluación de la expresión, el orden se puede modificar utilizando paréntesis. Por ejemplo

En a + b*c, la parte de expresión b*cse evaluará primero, con la multiplicación como precedente sobre la suma. Aquí usamos paréntesis paraa + b para ser evaluado primero, como (a + b)*c.

Algoritmo de evaluación de postfijo

Ahora veremos el algoritmo sobre cómo evaluar la notación postfija:

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 la implementación en lenguaje de programación C, haga clic aquí .