Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Pipe99 en 25 Abril 2018, 03:07 am



Título: ayuda con un arbol binario
Publicado por: Pipe99 en 25 Abril 2018, 03:07 am
Buenas noches, estoy haciendo un programa en java que apartir de un String que tiene una operacion matematica por ejemplo "5+7*3-56/5+45". esto tiene que quedar en un arbol binario y luego resolverse. Yo tenia planeado contar cuantos signos hay y dividirlo en 2 para que el gigno de la mitad sea la raiz y con subString poner la parte derecha de signo en el hijo derecho y la izquierda en el hijo izquierdo y hacer recursividad hasta completar el arbol. pero el problema es que nose como obtener la  posicion del signo de la mitad, por el momento solo se cuantos signos hay y pensaba hacer un arreglo que me guardara los numeros haciendo un split para que omita los signos
 
        String x="785+6-7*4/4+9+445";
       String separadores = "[\\+\\-\\*\\/]";
       String z[] = x.split(separadores);
       
       for(int i=0;i<z.length();i++){
          System.out.println(z);
       }

con esto logro guardar en un espacio los numeros de varios digitos pero no se como meter los signos en ese  arreglo. espero me haya echo entender y de antemano gracias por su ayuda.
Código
  1.  


Título: Re: ayuda con un arbol binario
Publicado por: rub'n en 26 Abril 2018, 00:43 am
Ostia macho, tu descripción incomoda, bueno a mi algo,

Mmmm,


Te refieres al signo del medio cual ?

Código
  1. String x = "785+6-7*4/4+9+445";


con esto logro guardar en un espacio los numeros de varios digitos pero no se como meter los signos en ese  arreglo. espero me haya echo entender y de antemano gracias por su ayuda.
Código
  1.  
con el método .insert() de la clase StringBuilder puedes meter esos signos que deseas en cualquier parte de tu String


Título: Re: ayuda con un arbol binario
Publicado por: Serapis en 27 Abril 2018, 02:31 am
0 - El árbol binario que pides, al caso dado, se llama arbol sintáctico.

1 - La función split, no vale, porque corta por los caracteres pedidos, dejando fuera esos caracteres qe son los operadores.
2 - Además, el operador de asignación '=', lo quedas fuera. Lo mismo que a x. 'x' es una variable, que debe ser tratado exactamente igual que si fuera un número.

3 - Toda la operatoria debe ser un bucle, que recorra buscando bytes o caracteres, reconozca numeros/variables/identificadores (como en el siguiente ejemplo) por un lado y operadores por otro. Los paréntesis también son operadores, en este caso de prioridad (se resuelve lo que está dentro  antes de resolver lo de más afuera).
x = (j * k) + 5 - ((n * 7) + cantidad)

4- Debes considerar la prioridad de los operadores, a falta de paréntesis, se deben seguir las reglas de precedencia de operadores,  y la estructura adecuada para mediar con el bucle y el árbol es una pila.

5 - Con un árbol sintáctico, los nodos terminales siempre contienen el operando (número, variable...) y los nodos internos contienen el operador, quedando el operador en medio de los operandos se conoce como notación infija

6 - Tal vez te interese seguir otro modelo. Revisa la notación polaca inversa, donde los 2 operandos quedan juntos antes del operador.

nota: te he marcado en negrita, todo aquello que puedes buscar en google, para profundizar...