2015-04-24 2 views
1

Моя программа должна получить уравнение (например: x^4 * (x + 3)) и преобразовать его в пост-порядок (или обратную полировку), после чего мне нужно создать дерево, которое должен быть помещен в стек. Трудная часть читается через уравнение порядка после заказа. В примере он должен быть:Деревья в стеке

х 4^х 3 + *

Таким образом, правила о создании дерева является:

Если это бинарная операция ("+", "-",»^","/"," * ") он должен взять первые 2 элемента стека, создать дерево с операцией в качестве корня и числа в качестве своих сыновей и вставить его в стек.

Если это унарная операция («&», которая представляет собой ln, «~», которая представляет отрицательный (~ 3) = (- 3)), то shoudl берет первый элемент стека, создает дерево с как корень, и число как его сын, и вставлять его в стек.

Если это число или буква, он должен создать узел без сыновей и просто вставить его в стек.

Моего алгоритма обнаружение, если это письмо, двоичные или унарные операции через строку: (Уравнение Post заказа уже создано, он был послан моим учителем, так что нет ничего, чтобы изменить там)

String aux=""; 
for (int i=0; i < nuevaF.length();i++){ 
    char c = nuevaF.charAt(i); 
    if (c!=' '){ 
     aux=aux+c; 
     System.out.println(aux); 
    } 
    if (c==' '){ 
     System.out.println("space"); 
     Transformar(stack,aux); 
     aux=""; 
    } 
} 

А затем создать стек:

public static void Transformar(PilaArreglo stack, String ecuacion){ 

     if (ecuacion=="+"||ecuacion=="-"||ecuacion=="*"||ecuacion=="/"||ecuacion=="^"){ 
      Nodo aux1 = stack.desapilar(); 
      Nodo aux2 = stack.desapilar(); 
      Nodo total = new Nodo(ecuacion,aux2, aux1); 
      System.out.println("hole"); 
      stack.apilar(total); 

     } 
     else if (ecuacion=="&"||ecuacion=="~"){ 
      Nodo aux1 =stack.desapilar(); 
      Nodo total2 = new Nodo(ecuacion,aux1); 
      System.out.println("holo"); 
      stack.apilar(total2); 
     } 
     else{ 
      Nodo total3 = new Nodo(ecuacion); 
      System.out.print("hele"); 
      stack.apilar(total3); 
     } 


} 

Моя проблема заключается в том, что он не обнаруживает, если это бинарная операция или нет. Он немедленно переходит к другому. Я печатаю Hole, holo и hele, чтобы увидеть, куда идут элементы, но все, что я получаю, это hele.

x 
hele4 
hele^ 
helex 
hele3 
hele+ 
hele* 

Я действительно не знаю, почему это пропуск других IFS, если это бинарная операция или унарный. На всякий случай, вот класс Tree

public class Nodo{ 
    Object element; 
    Nodo izq; 
    Nodo der; 
    Nodo(String x, Nodo y, Nodo z){ 
    element = x; 
    izq = y; 
    der = z; 
    } 
    Nodo(String x, Nodo y){ 
    element = x; 
    izq = y; 
    der = null; 
    } 
    Nodo(String x){ 
    element = x; 
    izq = null; 
    der = null; 
    } 
} 

И Stack (должен быть стопка Узлов)

class PilaArreglo{ 
     private Nodo[] arreglo; 
     private int tope; 
     private int MAX_ELEM=100; // max numbers on stack 

     public PilaArreglo(){ 
      arreglo=new Nodo[MAX_ELEM]; 
      tope=-1; // empty stack 
     } 

     public void apilar(Nodo x){ 
      if (tope+1<MAX_ELEM){ // if full, OVERFLOW 
       tope++; 
       arreglo[tope]=x; 
      } 
      else{ 
       MAX_ELEM=MAX_ELEM*2; 
       Nodo[] nuevo_arreglo=new Nodo[MAX_ELEM]; 
       for (int i=0; i<arreglo.length; i++){ 
        nuevo_arreglo[i]=arreglo[i]; 
       } 
      tope++; 
      nuevo_arreglo[tope]=x; 
      arreglo=nuevo_arreglo; 
      } 
     } 
     public Nodo desapilar(){ 
      if (!estaVacia()){ // si esta vacia se produce UNDERFLOW 
       Nodo x=arreglo[tope]; 
       tope--; 
       return x; 
       } 
       return null; 
     } 
     public Nodo tope(){ 
      if (!estaVacia()){ // si esta vacia es un error 
       Nodo x=arreglo[tope]; 
       return x; 
      } 
      return null; 
     } 

     public boolean estaVacia(){ 
      if (tope==-1) 
     { 
       return true; 
     } 
      else 
     { 
       return false; 
     } 
} 

Я ценю каждую помощь вы можете дать мне.

ответ

1

Вы используете == для сравнения строк, где вы должны использовать .equals при обнаружении операторов.

+0

Спасибо, это очень помогло. И мне также пришлось изменить много материала, чтобы он работал. Оценил! – Kyle

+0

Кайл, вы можете нажать зеленый флажок, чтобы принять мой ответ – fdsa

Смежные вопросы