ayuda con un arbol binario

Iniciado por Pipe99, 25 Abril 2018, 03:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Pipe99

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 (java) [Seleccionar]

rub'n

#1
Ostia macho, tu descripción incomoda, bueno a mi algo,

Mmmm,


Te refieres al signo del medio cual ?

Código (java) [Seleccionar]
String x = "785+6-7*4/4+9+445";


Cita de: Pipe99 en 25 Abril 2018, 03:07 AM
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 (java) [Seleccionar]

con el método .insert() de la clase StringBuilder puedes meter esos signos que deseas en cualquier parte de tu String


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

Serapis

#2
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...