/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package Nodos;
import java.util.EmptyStackException;
import java.util.Stack;
/**
*
* @author Rafael Angel Montero Fernpandez.
* Correo: rafaelangelmfx@gmail.com
* Celular de Costa Rica: +506 83942235
* Muy ultil para crear un analizador sintactico.
* Las expresiones salen bien si se respeta la cantidad de terminos.
* Al final tiene que ir la misma cantidad de operadores que terminos.
* Menos cantidad omite numeros y terminos de la operasion.
* Más cantidad coloca un operador al principio sin numeros a su izquierda.
*/
public class ArbolDeExpresiones {
public static void main(String []m){
final String EXPRESION_DE_PRUEBA ="ab+cde+**", Ejmplo2="22/24+467-5****";
NodoExpresivo raiz=new NodoExpresivo("");
raiz=raiz.CrearArbolDeExpreciones(Ejmplo2);
System.out.println("Expresion postfix mostrada en PostOrder");
raiz.postOrder();
System.out.println("\n\nExpresion Infix mostrada en InOrder");
raiz.inOrder();
}
}
class NodoExpresivo{
public NodoExpresivo Iz, Dr;
public String texto="";
public NodoExpresivo(String nuevo_texto){
texto=nuevo_texto;
}
public NodoExpresivo(String nuevo_texto, NodoExpresivo izquierda, NodoExpresivo derecha){
texto=nuevo_texto;
Iz=izquierda;
Dr=derecha;
}
public boolean esOperador(String nuevo_texto){
String []mOperadores={"+","-","*","/","=","^"};
for(int i=0; i<mOperadores.length; ++i){
if(nuevo_texto.equalsIgnoreCase(mOperadores[i])==true ){
return true;
}
}
return false;
}
private void msj(String datos){
System.out.println(datos);
}
public void postOrder(){
vPostOrder="";
System.out.println(postOrder(this));
}
private String vPostOrder="";
private String postOrder(NodoExpresivo nueva_raiz){
if(nueva_raiz==null){
return "";
}
postOrder(nueva_raiz.Iz);
postOrder(nueva_raiz.Dr);
vPostOrder+=nueva_raiz.texto;
return vPostOrder;
}
public void inOrder(){
vInOrder="";
System.out.println(inOrder(this));
}
private String vInOrder="";
private String inOrder(NodoExpresivo nueva_raiz){
if(nueva_raiz==null){
return "";
}
if(this.esOperador(nueva_raiz.texto)==true){
vInOrder+="(";
}
inOrder(nueva_raiz.Iz);
vInOrder+=nueva_raiz.texto;
inOrder(nueva_raiz.Dr);
if(this.esOperador(nueva_raiz.texto)==true){
vInOrder+=")";
}
return vInOrder;
}
/**
* Permite crear un arbol de expreciones a partir de una expresion tipo postfix.
* En la cual los operadores aparecen en medio o al final de la expresion (cadena de texto).
* @param expresion Un postfix o exprecion matemativa a analizar para crear el arbol.
* @return Retorna el arbol creado.
*/
public NodoExpresivo CrearArbolDeExpreciones(String expresion){
if(expresion.isEmpty()==true){
return null;
}
Stack<NodoExpresivo> s=new Stack();//Primer uso de Stack en Java, jueves 1 de setiembre del 2022.
for(char c: expresion.toCharArray()){
if(this.esOperador(c + "")==true){
//La entrada actual es un operador.
NodoExpresivo x=null;
try{
x=s.pop();
}catch(EmptyStackException e){}
NodoExpresivo y=null;
try{
y=s.pop();
}catch(EmptyStackException e){}
//Un nuevo arbol binario de expreciones.
NodoExpresivo nodo = new NodoExpresivo(c +"", y, x);
s.push(nodo); //Se inserta en la pila.
}
else{
//La entrada actual es un operando.
s.push(new NodoExpresivo(c+""));
}
}
return s.peek(); //Retorna el arbol sin borrarlo de la pila.
}
}
Comentarios sobre la versión: 1.0 (0)
No hay comentarios