2016-04-09 31 views
1

Her bir döngüde yuvarlandığında, ")" nin her bittiğinde yeni bir ağaç oluşturarak ve bu işleçleri/işlenenleri bir yığının içine geri alınacak bir yığına iterek, bir ikili ağacın içine bir ifade yapıyorum ikili ağaç.İkilik Ağaç Oluşturma

Benim Yapı Yöntem:

package lab5; 

import net.datastructures.*; 

public class Expression<T> { 

/** Contain Linked Tree and Linked Stack instance variables **/ 
LinkedBinaryTree<T> tree; 
LinkedStack<LinkedBinaryTree<T>> stack; 


public Expression() { 
    tree = new LinkedBinaryTree<T>(); 
    stack = new LinkedStack<LinkedBinaryTree<T>>(); 

} // end constructor 

public LinkedBinaryTree<T> buildExpression (String expression) {// LinkedBinaryTree<T> is a type of LinkedBinaryTree 
    // major TODO to implement the algorithm] 
    LinkedBinaryTree<T> operand, op1, op2; 
    LinkedStack<LinkedBinaryTree<T>> newStack = new LinkedStack<LinkedBinaryTree<T>>(); 
    String symbol; 

    int i = 0; 
    int len = expression.length(); 

    for (i = 0; i < len; i++) { 
     symbol = expression.substring(i, i+1); 

     if ((!symbol.equals ("(")) && (!symbol.equals (")"))) { 
      operand = new LinkedBinaryTree<T>(); 
      operand.addRoot((T)symbol); 
      newStack.push(operand); 
     } else if (symbol.equals ("(")){ 
      continue; 
     } else { 
      op2 = newStack.pop(); 
      operand = newStack.pop(); 
      op1 = newStack.pop(); 
     tree.attach(operand.root(), op1, op2); 
     newStack.push(tree); 
     } 
    } 
    tree = newStack.pop(); 
    return tree; 

} // end method buildExpression 

}

Benim Testi:

package lab5; 
import net.datastructures.*; 

public class ExpressionTest { 

/** 
* @param args 
* @throws EmptyTreeException 
*/ 

/** Paranthesize is code fragment 8.26 pg. 346 **/ 

/** evaluateExpression method apart of LinkedBinaryTree class in net.datastructures **/ 

public static void main(String[] args) { 
    // declare local variables/objects 
      String s = new String(); 
      String exp = "((((3+1)x3)/((9-5)+2))-((3x(7-4))+6))"; //-13 
      Expression<String> expression = new Expression<String>(); 

      // print the expression string 
      System.out.printf ("The original Expression String generated via printf: %s", exp); 

      // create the tree using the 'stub' method 
      // i.e. it does nothing 
      LinkedBinaryTree<String> tree = expression.buildExpression (exp); 

      // use Object.toString simply to print its reference 
      System.out.printf ("\n\nThe Tree: %s\n", tree); 

    } 

} 

Bir NullPointerException alıyorum ve nedenini bilmiyorum. 'Denemeye' ihtiyacım var mı ve hatanın geçmesine izin mi vereyim?

+0

Bir hata ayıklayıcısını, nerede ve neden hatalı olduğunu kontrol etmek için kullanmalısınız. – ekeith

+0

Ağacın kökü nedeniyle uygulamanın akışını askıya alıyor. Bir LinkedBinaryTree.class içinde t1.root.setParent (düğüm) sonra benim LinkedBinaryTree nesne başlatımı kapmak için kullanıyorum sonra durur. Bu, kitabın im okuma kitabının yazarı tarafından sağlanan bir net. Kitapta addRoot (element) kullanırsam, ağacın boş olmaması durumunda bir hata oluşur. –

+0

Bu hatayı yakalamak için koşulları ayarlıyor musunuz? eğer sen bunu addRoot (element) metodunda söyleyemezsen eğer (root == null) {// addRootElement;} else {// zaten bir root olduğunu gösteren bir hata mesajı döndürür ' – ekeith

cevap

1

Muhtemelen hata, (tek tırnak işareti) yerine "(" (çift tırnak) yerine symbol.equals ('(') numaralı telefondan kontrol edilmesiyle ilgilidir. Bir dizeyi, asla eşit olmayacak bir karakterle karşılaştırırsınız.

Belki de stack başlatılamadı? Yerel olarak buildExpression() olmalıdır. Kod snippet'inizin derlemek olmaz

Not: buildExpression() statik olabilir ki kullanılmayan boş önleyeceğini:

  • stack BTW
  • symbol

tanımlanmamıştır tanımlı değil ana ifade ifadesi.

"(" için ilk kez kontrol edilmesi, "("'un iki kez kontrol edilmesinden kaçınır.

+0

Üzgünüz cevap vermem uzun sürdü. Tamam, yukarıda buildExpression kodumu güncelledim. Hala NullPointerException aynı hatayı alıyorum. İşte hata: 'printf ile üretilen orijinal İfade Dizesi: ((((3 + 1) x3)/((9-5) +2)) - ((3x (7-4)) + 6)) İstisna thread "main" içinde "java.lang.NullPointerException" –

+0

İfade için yazdırılan yığın izi nedir? –

+0

Ne demek istediğini anlamadım. –