EXPRESIONES INFIJAS:
Para evaluar expresiones, se hace uso de algunas técnicas utilizadas en
el diseño de compiladores.
Las expresiones según su notación pueden ser:
Notación infija.- operando-operador-operando. Ejemplo: A + B Notación prefija.- operador-operando-operando. Ejemplo: + A B Notación postfija.- operando-operando-operador. Ejemplo: A B +
Al hacer uso de las expresiones infijas, la expresión 1 + 5; consiste de un operador binario junto con sus operandos (argumentos). Una expresión más elaborada es: 1 + 5 * 2; la cual matemáticamente es evaluada a 11, debido a que, el operador * (de multiplicación) tiene mayor precedencia que el de suma.
Si no se tiene en cuenta la precedencia, la respuesta será 12.
Las expresiones en postfija, proporcionan un mecanismo directo de evaluación; existiendo algoritmos de pila para la resolución.
Las expresiones según su notación pueden ser:
Notación infija.- operando-operador-operando. Ejemplo: A + B Notación prefija.- operador-operando-operando. Ejemplo: + A B Notación postfija.- operando-operando-operador. Ejemplo: A B +
Al hacer uso de las expresiones infijas, la expresión 1 + 5; consiste de un operador binario junto con sus operandos (argumentos). Una expresión más elaborada es: 1 + 5 * 2; la cual matemáticamente es evaluada a 11, debido a que, el operador * (de multiplicación) tiene mayor precedencia que el de suma.
Si no se tiene en cuenta la precedencia, la respuesta será 12.
Las expresiones en postfija, proporcionan un mecanismo directo de evaluación; existiendo algoritmos de pila para la resolución.
CONVERSIÓN EXPRESIÓN INFIJA A POSFIJA
El siguiente algoritmo traduce una expresión en notación infija a notación postfija:
Entrada: Una lista que contiene los términos de la ecuación en notación infija (la notación habitual).
Salida: Una lista que contiene los términos de la ecuación en notación postfija.
Crear pila y la lista de salida, inicialmente vacias.
Datos locales: Una pila, que va a contener operadores y paréntesis izquierdos.
INICIO
MIENTRAS lista de entrada no este vacia y
Insertar E al final de la lista de salida
no se ha encontrado ningun error HACER
Extraer el primer termino de la lista (lo llamaremos E)
SEGUN-SEA E
CASO E es número :
CASO E es la variable x :
MIENTRAS La pila no este vacía y
Insertar E al final de la lista de salida
CASO E es un paréntesis izquierdo :
Insertar E en la pila
CASO E es un paréntesis derecho :
su cima no sea un paréntesis izquierdo HACER
Se ha detectado un ERROR 2
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
SI Encontramos el parentesis izquierdo ENTONCES
Extraerlo de la pila y destruirlo
SINO
FIN-SI
Destruir E
FIN-MIENTRAS
CASO E es un operador :
MIENTRAS La pila no este vacía y
su cima sea un operador
de precedencia mayor o igual que la de E HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN
Insertar E en la pila
FIN-SEGUN-SEA
FIN-MIENTRAS
MIENTRAS Pila no esté vacía HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
Destruir pila
Ejemplo de pila
import java.util.Scanner; public class Pila { class Nodo { int info; Nodo sig; } private Nodo raiz; public Pila () { raiz=null; } public void insertar(int x) { Nodo nuevo; nuevo = new Nodo(); nuevo.info = x; if (raiz==null) { nuevo.sig = null; raiz = nuevo; } else { nuevo.sig = raiz; raiz = nuevo; } } public int extraer () { if (raiz!=null) { int informacion = raiz.info; raiz = raiz.sig; return informacion; } else { return Integer.MAX_VALUE; } } public void imprimir() { Nodo reco=raiz; System.out.println("Listado de todos los elementos de la pila."); while (reco!=null) { System.out.print(reco.info+"-"); reco=reco.sig; } System.out.println(); } public static void main(String[] ar) { Pila pila1=new Pila(); pila1.insertar(10); pila1.insertar(40); pila1.insertar(3); pila1.imprimir(); System.out.println("Extraemos de la pila:"+pila1.extraer()); pila1.imprimir(); } } }
Ejemplo de pila
import java.util.Scanner; public class Parser { private static final int EOL = 0; private static final int VALUE = 1; private static final int OPAREN = 2; private static final int CPAREN = 3; private static final int EXP = 4; private static final int MULT = 5; private static final int DIV = 6; private static final int PLUS = 7; private static final int MINUS = 8; private static final int FUNCT = 9; private static String[] function = { "sqrt","sin", "cos","tan", "asin","acos", "atan","log", "floor","eXp" }; private String string; private Stack opStack; // Operator stack for conversion private Stack postfixStack; // Stack for postfix machine private StringTokenizer str; // StringTokenizer stream // . . . continua codigo de los metodos de la clase . . . public double getValue(double x) { return getValue(x,0,0); } public double getValue(double x,double y) { return getValue(x,y,0); } public double getValue(double x,double y,double z) { // for each call opStack = new Stack( ); postfixStack = new Stack( ); str = new StringTokenizer(string,"+*-/^()xyz ",true); opStack.push( new Integer( EOL ) ); EvalTokenizer tok = new EvalTokenizer(str,x,y,z); Token lastToken; do { lastToken = tok.getToken( ); processToken( lastToken ); } while( lastToken.getType( ) != EOL ); if( postfixStack.isEmpty( ) ) { System.err.println( "Missing operand!" ); return 0; } double theResult = postFixTopAndPop( ); if( !postfixStack.isEmpty( ) ) System.err.println( "Warning: missing operators!" ); return theResult; } } }
No hay comentarios:
Publicar un comentario