Notacion polaca

Iniciado por xAgramonx, 17 Octubre 2010, 03:31 AM

0 Miembros y 3 Visitantes están viendo este tema.

xAgramonx

hola que tal amigos del foro ps me tope con un gran problema creo que es el tema que mas se me a complicado en programcion java

la situacion es esta como se daran cuenta hablaremos de notacion polaca

NOTACIONES CON EXPRESIONES.
Las pilas son estructuras de datos implementadas para la solución de diversos
tipos de problemas. Pero tal vez la aplicación más importante de estas es el
tratamiento de expresiones matemáticas. El convertir expresiones en notación
infija en su equivalente en notación postfija (o prefija). A continuación es
necesario analizar algunos conceptos para introducirnos a este tema.
• La expresión A+B se dice que esta en notación infija, y su nombre se
debe a que el operador + está entre los operandos A y B.
• Dada la expresión AB+ se dice que esta en notación postfija y su
nombre se debe a que el operador + esta después de los operandos A y B.
• Dada la expresión +AB se dice que esta en notación prefija, y su nombre
se debe a que el operador + está antes que los operandos A y B.
La ventaja de usar estas expresiones en notación postfija o prefija radica en que
no son necesarios los paréntesis para indicar el orden de la operación, ya que este
queda establecido por la ubicación de los operadores con respecto a los
operandos.
Para convertir expresiones a las diferentes notaciones ya descritas, es necesario
establecer ciertas condiciones:
• Solamente se manejaran los siguientes operadores en orden de prioridad:
^ potencia
* / Multiplicación y división
+ - suma y resta
• Los operandos de más alta prioridad se ejecutan primero
• Si hubiese una expresión de dos o más operadores de igual prioridad, se
ejecutan de izquierda a derecha.
• Las subexpresiones parentizadas tendrán más prioridad que cualquier


Y de una buena explicacion comenzamos no soy muy bueno en esto como dije se me complico el tema espero que para todos que esten como yo ps le sirva de al gun modo tendran alguno ejemplos que publiquen.

Elabora un program en java utilizando algoritmos de estructura de datos pilas en memoria dinamica en donde evalue las expreciones utilizando expresion polaca.

  • El programa debe pedir la expresion
  • Verificar que la exprecion sea correcta si no volver a pedir.
  • El programa debera pedir que de seas hacer  en este caso serian casos  elegir entre infijo y postfijo.
  • La expresion resultante acsinarle valores, dar el resultado.

Como veran si estan complejo el programa sigo buscando entre los demas foros pero creo que no tocan ese tema espero que alguin me pueda ayudar y explicar.



xAgramonx

#1
Hola que tal que vacio esta este post bueno a mi navegacion de por el internet en contre el programa en java de infijo a postfijo funciona de maravilla ha hora estoy batallando en que puedo cambiar para que lo pueda hacer en prefijo

Código (java) [Seleccionar]

public class Pila{
   public Nodo tope;  
public Pila(){
tope=null;
}
public boolean vacia (){
return tope == null;//==hace la compararcion de primernodo con null
}
public void apilar(Object dato){
    Nodo p=new Nodo(dato);
    p.datos=dato;
    p.siguiente=tope;
    tope=p;
 }
   public Object desApilar(){
        //if(vacia()) return ' ';
        Object dat;  
        Nodo p=tope;
        dat=p.datos;  
    tope=tope.siguiente;
    p=null;
    return dat;
 }
   public void imprimir(){
if (vacia()){
System.out.println("La pila esta vacia...");
}
else{
Nodo Actual=tope;
do{
System.out.print(Actual.getElemento().toString()+" ");
Actual=Actual.siguiente;
}while(Actual != null);
System.out.println();//imprime un salto de linea
}
}  
}


Bueno este es el codigo de infijo a postfijo ha hora quiero de infijo a prefijo me han dicho varios que modifique la pila por que es la que cambia el lugar pero ps la mera verdad nose que cambira si alguien me podria yudar por favor y que esto se de ejemplo a otros.

soser

Bien, tube el mismo problema que tu y la solucion para pasar una notacion infijo a prefijo es que se evalua exactamente igual que el postfijo solo que a la inversa, a lo que me refiero es que si por ejemplo tienes la expresion "a+b" en postfijo evaluas primero la a, depues el signo y al final la b, en el caso del prefijo se empieza a evaluar desde la b hacia la a, y ya terminada la expresion el resultado debe de ser invertido.
Otro punto importante es que las prioridades en el prefijo cambian, en postfijo el ")" tiene una prioridad mayor al "(", en el prefijo es lo contrario.
Saludos

Grave

http://es.wikipedia.org/wiki/Algoritmo_shunting_yard

Actualmente estoy haciendo una calculadora aritmetica q aplica ese algoritmo, no publico el codigo porq todavia no me califican y me pueden plagiar XD
"y el conocimiento os hara libres"

Module Console1
   Console.Write("Hello Word")
   Console.ReadLine()
End Module
http://aion.cr0n0triger.operaunite.com/

xAgramonx

Despues de tanto esfuerzo lo pude hacer me lo calificaron y ps para los que no quieran estar matándose como yo les dejo el código
Código (java) [Seleccionar]
import java.util.Scanner;
import javax.swing.JOptionPane;
public class AnalizadorIJ{
public static char x[];
public static  String invertida,postfija,nueva;
public static char a[];
public static char pila[];
public static int tope,i,cont,j,a1,a2,k,l,n,m;
public static String invierte(String a)
{
invertida="";
nueva="";
x=a.toCharArray();
for(int p=x.length-1;p>=0;p--)
{
invertida=invertida+String.valueOf(x[p]);
}
x=invertida.toCharArray();
for (int p=0;p<x.length;p++)
{
if (x[p]==')')
{x[p]='(';
nueva=nueva+String.valueOf(x[p]);}
else if(x[p]=='(')
{x[p]=')';
nueva=nueva+String.valueOf(x[p]);}
else
nueva=nueva+String.valueOf(x[p]);
}
return(nueva);
}
public static String pofija(String entrefija)
{
entrefija="("+entrefija+")";
tope=-1;
postfija="";
pila=new char[250];
a=entrefija.toCharArray();
tope=Cabecera.pushPila(pila,tope,'#');
for(i=0;i<a.length;i++)
{
if(a[i]=='(')
{
tope=Cabecera.pushPila(pila,tope,a[i]);
}
else if(a[i]==')')
{
cont=tope;
while(pila[cont]!='(')
{
postfija=postfija+String.valueOf(pila[cont]);
tope=Cabecera.popPila(pila,tope);
cont--;
}
if (tope!=0)
tope=Cabecera.popPila(pila,tope);
}
else if(Cabecera.evaluar(a[i])==4)
{
postfija=postfija+String.valueOf(a[i]);
}
else
{
cont=tope;
while(pila[cont]!='('&&Cabecera.evaluar(pila[cont])>=Cabecera.evaluar(a[i]))
{
postfija=postfija+String.valueOf(pila[cont]);
tope=Cabecera.popPila(pila,tope);

cont--;
}

tope=Cabecera.pushPila(pila,tope,a[i]);
}


}
return(postfija);


}

public static void tercerpa(String cade)
{
System.out.println(invierte(pofija(invierte(cade))));

}
public static void main (String args[])
{
AnalizadorIJ uno=new AnalizadorIJ();
Scanner ent=new Scanner(System.in);
System.out.println("Inserta la exprecion en infijo: ");
String pre=ent.next();
System.out.println("En prefijo es: ");
uno.tercerpa(pre);
}
}

Código (java) [Seleccionar]
import java.util.LinkedList;
import java.util.*;
public class AnalizadorIP{ 
private LinkedList PROCEDENCIA;
    private  Pila pila;
    public AnalizadorIP() {
      Operador ope;
          PROCEDENCIA=new LinkedList();
          ope=new Operador("^",4,5);PROCEDENCIA.add(ope);
          ope=new Operador("%",3,4);PROCEDENCIA.add(ope);
          ope=new Operador("*",2,2);PROCEDENCIA.add(ope);
          ope=new Operador("/",2,2);PROCEDENCIA.add(ope);
          ope=new Operador("+",1,1);PROCEDENCIA.add(ope);
          ope=new Operador("-",1,1);PROCEDENCIA.add(ope);
          ope=new Operador("(",0,5);PROCEDENCIA.add(ope);//inicial y maximo
          pila=new Pila();
    }
    public boolean valExpre(String expre){
    Pila p=new Pila();
    for(int i=0;i<expre.length();i++){
              char x=expre.charAt(i);
               if(x=='(' | x=='[' | x=='{')
                  p.apilar(x);
               else{
                  if(x==')' | x==']' | x=='}')
                     { if(p.vacia()==true) return false;
                        char c=p.desApilar().toString().charAt(0);
                        if( (x==')' & c!='(') | (x==']' & c!='[') | (x=='}' & c!='{'))
                           return false;   
                       }
                  }   
           }
        return p.vacia(); 
    }
    public String aPostfija(String expre)
     { LinkedList expPostfija=new LinkedList();
       if(valExpre(expre)==false) return null;
       for(int c=0;c<expre.length();c++){
            char x;int hcer=-1;
            x=expre.charAt(c);
            if(operador(x)==true) hcer=323;//si es operador direcciona al caso
            if(x==')' ) hcer=324;//si es de cierre,
            switch(hcer){
               case 323:
                       while(pila.vacia()==false) {
                          if(pdp(pila.tope.datos)>=pfp(x))
                             expPostfija.add(pila.desApilar());
                          else
                            break;   
                          }
                      pila.apilar(x);     
               break;
               case 324:
                       while(pila.tope.datos.toString().charAt(0)!='(' )
                               expPostfija.add(pila.desApilar());
                          pila.desApilar(); //para q ignore el parentesis (
               break;
               default:
                     expPostfija.add(x);
                }
            }
          while(pila.vacia()==false)
            expPostfija.add(pila.desApilar());
             
        return cnvCad(expPostfija); 
     }
    public boolean operador(Object c ) {
      for(int i=0;i<PROCEDENCIA.size();i++){
         Operador op=(Operador)PROCEDENCIA.get(i);
          if(op.OPE.equals(c.toString())) return true;
      }
      return false;
     }
     public int pdp(Object c ) {
      for(int i=0;i<PROCEDENCIA.size();i++){
         Operador op=(Operador)PROCEDENCIA.get(i);
         if(op.OPE.equals(c.toString())) return op.PDP;
         
        }
      return -1;
     }
     public int pfp(Object c ) {
      for(int i=0;i<PROCEDENCIA.size();i++){
         Operador op=(Operador)PROCEDENCIA.get(i);
         if(op.OPE.equals(c.toString())) return op.PFP;
      }
      return -1;
     }
    private String cnvCad(LinkedList ls){
    String cad="";
    for(int i=0;i<ls.size();i++)
        cad=cad+ls.get(i).toString().charAt(0);
     return cad;   
      }
    private static void imprimirLs(LinkedList ls)
     { for(int i=0;i<ls.size();i++)
        System.out.print(ls.get(i).toString().charAt(0));
        System.out.println(" ");
      } 
public static void main(String Args[])
  {
Scanner ent=new Scanner(System.in);
System.out.println("Inserte la exprecion en infijo: ");
    String expresion=ent.next();
    AnalizadorIP AS = new AnalizadorIP();
    System.out.println("La sentencia es: "+AS.valExpre(expresion));
    String expPostfija=AS.aPostfija(expresion);
    if(expPostfija==null)
      System.out.println("Expresion invalida...");
    else
      System.out.println(" En PostFijo es: "+expPostfija);
  }

}[code=java]
import javax.swing.JOptionPane;
class Cabecera
{
public static int eva;
public static int pushPila(char pila[],int tope,char dato)
{
if (tope<pila.length)
{
tope++;
pila[tope]=dato;
return (tope);
}
else
JOptionPane.showMessageDialog(null,"pila llena ... OverFlow");
return (tope);
}
public static int popPila(char pila[],int tope)
{
if (tope!=-1)
{
pila[tope]=0;
tope--;
return (tope);
}
else
JOptionPane.showMessageDialog(null,"Pila vacia ... underflow");
return (tope);

}
public static int ver(char pila[],int tope)
{
int i;
String s="";
for(i=tope;i>=0;i--)
{
s+="posicion "+i+" = "+pila[i]+'\n';
}
JOptionPane.showMessageDialog(null,s);
return tope;
}
public static int evaluar(char a)
{
if (a=='+'||a=='-')
{
eva=1;
}
else if(a=='/'||a=='*')
{
eva=2;
}
else if (a=='^')
{
eva=3;
}
else if (a=='('||a==')')
eva=5;
else
{
eva=4;
}
return eva;
}
}
Código (java) [Seleccionar]

public class Nodo{
/*****Propiedades**************/
  public Object datos;
     public Nodo siguiente;
     public Nodo anterior;
/*****Constructores************/
public  Nodo (Object valor){
datos =valor;
  siguiente =anterior= null;
}
/*****Inicio***METODOS*********/
public Object getElemento(){return datos;}
public Nodo getSig(){return siguiente;}
public Nodo getAnt(){return anterior; }
/*****Fin******METODOS*********/
}

Código (java) [Seleccionar]

public class Operador
{  public String OPE;//operador que se esta representando
   public int PDP;//prioridad dentro de la pila
   public int PFP;//prioridad fuera de la pila
   public Operador(String ope,int pd,int pf){
         OPE=ope;
         PDP=pd;
         PFP=pf;
     }
   
}

Código (java) [Seleccionar]

public class Pila{
    public Nodo tope;   
public Pila(){
tope=null;
}
public boolean vacia (){
return tope == null;//==hace la compararcion de primernodo con null
}
public void apilar(Object dato){
     Nodo p=new Nodo(dato);
     p.datos=dato;
     p.siguiente=tope;
     tope=p;
  }
    public Object desApilar(){
         //if(vacia()) return ' ';
         Object dat;   
         Nodo p=tope;
         dat=p.datos; 
     tope=tope.siguiente;
     p=null;
     return dat;
  }
    public void imprimir(){
if (vacia()){
System.out.println("La pila esta vacia...");
}
else{
Nodo Actual=tope;
do{
System.out.print(Actual.getElemento().toString()+" ");
Actual=Actual.siguiente;
}while(Actual != null);
System.out.println();//imprime un salto de linea
}
}    
/* public static void main(String[]args){
Pila p=new Pila();
p.apilar("1");
p.apilar("2");
p.apilar("3");
p.apilar("4");
p.imprimir();
p.desApilar();
p.imprimir();*/
}
Código (java) [Seleccionar]

import javax.swing.JOptionPane;
import java.awt.*;
class Procesos
{
public static  String postfija;
public static char a[],b[],c[],d[],e[],f[];
public static char pila[],pila1[],pila2[];
public static int tope,i,cont,j,a1,a2,k,l,n,m;
public static boolean t=false,lp;
public static void Convert(String entrefija,List uno,List dos,List tres,List cuatro,List cinco,List seis,Label letra)
{
entrefija="("+entrefija+")";
tope=-1;
postfija="";
pila=new char[250];
a=entrefija.toCharArray();
tope=Cabecera.pushPila(pila,tope,'#');
for(i=0;i<a.length;i++)
{
if(a[i]=='(')
{
tope=Cabecera.pushPila(pila,tope,a[i]);
dos.addItem(String.valueOf(a[i]));
cinco.addItem(String.valueOf(a[i]));
}
else if(a[i]==')')
{
cont=tope;
while(pila[cont]!='(')
{

postfija=postfija+String.valueOf(pila[cont]);
tres.addItem(String.valueOf(pila[cont]));
seis.addItem(String.valueOf(pila[cont]));
tope=Cabecera.popPila(pila,tope);
cinco.remove(cont);
cont--;
}
if (tope!=0)
cinco.remove(tope);
tope=Cabecera.popPila(pila,tope);

}
else if(Cabecera.evaluar(a[i])==4)
{
tres.addItem(String.valueOf(a[i]));
seis.addItem(String.valueOf(a[i]));
postfija=postfija+String.valueOf(a[i]);
}
else
{
cont=tope;
while(pila[cont]!='('&&Cabecera.evaluar(pila[cont])>=Cabecera.evaluar(a[i]))
{
tres.addItem(String.valueOf(pila[cont]));
seis.addItem(String.valueOf(pila[cont]));
postfija=postfija+String.valueOf(pila[cont]);
tope=Cabecera.popPila(pila,tope);
cinco.remove(cont);
cont--;
}
dos.addItem(String.valueOf(a[i]));
cinco.addItem(String.valueOf(a[i]));
tope=Cabecera.pushPila(pila,tope,a[i]);
}

System.out.println(a[i]);
uno.addItem(String.valueOf(a[i]));
cuatro.addItem(String.valueOf(a[i]));
}
System.out.println(postfija);
letra.setText(postfija);

}
public static boolean vercadena(String pp)
{
if(balanceo(pp)==true&&entrefija(pp)==true)
{
b=pp.toCharArray();
for(j=0;j<b.length;j++)
{
if (b[j]=='A'||b[j]=='B'||b[j]=='C'||b[j]=='D'||b[j]=='E'||b[j]=='F'||b[j]=='G'||b[j]=='H'||b[j]=='I'||b[j]=='J'||b[j]=='K'||b[j]=='L'||b[j]=='M'||b[j]=='N'||b[j]=='Ñ'||b[j]=='O'||b[j]=='P'||b[j]=='Q'||b[j]=='R'||b[j]=='S'||b[j]=='T'||b[j]=='U'||b[j]=='V'||b[j]=='W'||b[j]=='X'||b[j]=='Y'||b[j]=='Z'||b[j]=='+'||b[j]=='-'||b[j]=='*'||b[j]=='/'||b[j]=='^'||b[j]=='('||b[j]==')')
{
t=true;
}
else
{
j=b.length;
t=false;
}
}
}
return t;
}
public static boolean balanceo(String cadena)
{
c=cadena.toCharArray();
for(k=0;k<c.length;k++)
{
if(c[k]=='(')
a1=a1+1;
else if (c[k]==')')
a2=a2+1;
}
if (a1==a2)
return true;
else
return false;
}
public static boolean entrefija(String algo)
{
d=quita(algo).toCharArray();
for(l=1;l<d.length-1;l++)
{
if (signo(d[l-1])==1&&signo(d[l])==2&&signo(d[l+1])==1)
{
lp=true;
}
else if (signo(d[l-1])==2&&signo(d[l])==1&&signo(d[l+1])==2)
{
lp=true;
}
else
{
l=d.length-1;
lp=false;
}


}
return lp;
}
public static String quita(String a)
{
String ha="";
e=a.toCharArray();

for( n=0;n<e.length;n++)
{
if (Cabecera.evaluar(e[n])!=5)
ha=ha+String.valueOf(e[n]);
}
return ha;
}
public static int signo(char al)
{
int f;

if (al=='*'||al=='/'||al=='+'||al=='-'||al=='^')
f=2;
else
f=1;
return f;
}
}

;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
::) ::) ::)

[/code]

RORONOA ZORO

#5
men manda error en la parte de  } [ code = java ]    por que se ria no me jala mejor dicho es el unico error que me manda urgente jiij defavor  para ver como corregirlo por que no me jala (el de las converciones  de  xAgramonx)

1mpuls0

Cita de: RORONOA ZORO en 13 Diciembre 2010, 13:29 PM
men manda error en la parte de  } [ code = java ]    por que se ria no me jala mejor dicho es el unico error que me manda urgente jiij defavor  para ver como corregirlo por que no me jala (el de las converciones  de  xAgramonx)

MEGALOL  :laugh:
Si que me has hecho reir.

Lo siento. Solo borra esa parte [ code = java ]

Saludos.
abc

RORONOA ZORO

JAJAJA  :D CASI ME LA CREO MEN PERO NEL A HORA ME MANDA OTRO ERROR
import javax.swing.JOptionPane;
^
1 error

Tool completed with exit code 1
IGUAL SI LO QUITO  ME MANDA OTROS CUATRO
1*
location: class Cabecera
JOptionPane.showMessageDialog(null,"pila llena ... OverFlow");
2*
location: class Cabecera
JOptionPane.showMessageDialog(null,"Pila vacia ... underflow");
3*
location: class Cabecera
JOptionPane.showMessageDialog(null,s);
4*
Note: Recompile with -Xlint:unchecked for details.
4 errors

Tool completed with exit code 1   :rolleyes:  ;-) :laugh: :silbar: ::) :D  Y YA COMPILES LOS DEMAS PERO NADA

1mpuls0

#8
Cita de: RORONOA ZORO en 14 Diciembre 2010, 13:11 PM
JAJAJA  :D CASI ME LA CREO MEN PERO NEL A HORA ME MANDA OTRO ERROR
import javax.swing.JOptionPane;
^
1 error

Tool completed with exit code 1
IGUAL SI LO QUITO  ME MANDA OTROS CUATRO
1*
location: class Cabecera
JOptionPane.showMessageDialog(null,"pila llena ... OverFlow");
2*
location: class Cabecera
JOptionPane.showMessageDialog(null,"Pila vacia ... underflow");
3*
location: class Cabecera
JOptionPane.showMessageDialog(null,s);
4*
Note: Recompile with -Xlint:unchecked for details.
4 errors

Tool completed with exit code 1   :rolleyes:  ;-) :laugh: :silbar: ::) :D  Y YA COMPILES LOS DEMAS PERO NADA

1. NO escribas en mayusculas.
2. Seguro que eres programador de Java?  :¬¬
3. Tuve que compilar el código para ver cuál es el problema (creo que eres tú)

Note: C:\Documents and Settings\Administrador\Mis documentos\JCreator Pro\MyProjects\AnalizadorIJ\src\Procesos.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: C:\Documents and Settings\Administrador\Mis documentos\JCreator Pro\MyProjects\AnalizadorIJ\src\AnalizadorIP.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Process completed.


4. Creo que esto lo intentas compilar en un solo archivo por eso te marca ese error.

Código (java) [Seleccionar]

import java.util.LinkedList;
import java.util.*;
public class AnalizadorIP{ 
private LinkedList PROCEDENCIA;
....

else
      System.out.println(" En PostFijo es: "+expPostfija);
  }

}

//De aquí para abajo pasalo a otro archivo
import javax.swing.JOptionPane;
class Cabecera
{
public static int eva;
public static int pus
...

{
eva=4;
}
return eva;
}
}
[/code=java]


Un saludo.
abc

RORONOA ZORO

#9
Solo copie y pege  ;D tal como estab ;D a, en algunos no me manda error :silbar: :rolleyes: :o  pero en otros si jala chido  :D :o :)  ;-)
jajajaj

Lo que copie fue desde donde decia esto empexando desde codigo
--Despues de tanto esfuerzo lo pude hacer me lo calificaron y ps para los que no quieran estar matándose como yo les dejo el código
Código
----+-+-+-+--+
y los que le siguen men pero me manda error y estoy con el editor de texto texpad  pero nel no jala algunos compilan y no mandan error el pex esta al compilar los demas me mandan error.
Es mas los volvi a copiar y apegar tal cual estan pero no  jalan todos el AnalizadorIJ ni el AnalizadorIP.

PROGRAMA DE LA PROFE NORA Y TED EN PROCESO\Nueva carpeta\AnalizadorIJ.java:73: cannot find symbol
symbol  : variable Cabecera
location: class AnalizadorIJ
tope=Cabecera.pushPila(pila,tope,a);
    ^
9 errors

PROGRAMA DE LA PROFE NORA Y TED EN PROCESO\Nueva carpeta\AnalizadorIP.java:115: class, interface, or enum expected
import javax.swing.JOptionPane;
^
1 error

Tool completed with exit code 1
men gracias pero no jala el programa o es que no me reconoce las variables por que no estoy usando el JCreator Pro

los unicos que memandan error es A..IP A..Jp y el programa de Procesos. :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: