2016-12-10 8 views
0

スペースで区切られたユーザー入力を読み込み、その値をツリーに挿入しようとしています。私は2桁の整数があるまですべてが正しく動作しています。それは、最初に両方を読んでツリーに2桁の整数を挿入したいときに、各整数のcharを読み込んでツリーに挿入しているようです。スペースで区切ってツリーに挿入するJavaの読み込み

e、g。ユーザーが10 3 + 7 *を入力すると、最初に10が挿入され、0が挿入されます。これは10を挿入します(これは、 EQN)ここで

は、私がこれまで持っているものです。私のメインクラスで

私buildTree方法で

public static void main(String [] args){ 
    Scanner scan = new Scanner(System.in); 
    ExpressionTree et = new ExpressionTree(); 
    System.out.println("\nEnter equation: "); 
    et.buildTree(scan.nextLine()); 
} 

..

public void buildTree(String eqn){ 
    for(int i = 0; i <= eqn.legnth()-1; i++) 
    insert(eqn.charAt(i)); //how to insert 10 instead of 1 and then 0?? 
} 

私はに問題があることを知っています私のbuildTreeメソッドが、私はいいえ

package expressiontreetest; 

import java.util.Scanner; 


class ExpressionTree { 
class TreeNode { 
    char data; 
    TreeNode left, right; 

    /** constructor **/ 
    public TreeNode(char data) { 
     this.data = data; 
     this.left = null; 
     this.right = null; 
    } 
} 
class StackNode { 
    TreeNode treeNode; 
    StackNode next; 
    public StackNode(TreeNode treeNode) { 
     this.treeNode = treeNode; 
     next = null; 
    } 
} 

private static StackNode top; 
public ExpressionTree() { 
    top = null; 
} 
public void clear() { 
    top = null; 
} 
private void push(TreeNode ptr) { 
    if (top == null) top = new StackNode(ptr); 
    else { 
     StackNode nptr = new StackNode(ptr); 
     nptr.next = top; 
     top = nptr; 
    } 
} 
private TreeNode pop() { 
    if (top == null) throw new RuntimeException("Underflow"); 
    else { 
     TreeNode ptr = top.treeNode; 
     top = top.next; 
     return ptr; 
    } 
} 
private TreeNode peek() { 
    return top.treeNode; 
} 
private void insert(char val) { 
    try { 
     if (isDigit(val)) { 
      TreeNode nptr = new TreeNode(val); 
      push(nptr); 
     } 
     else if (isOperator(val)) { 
      TreeNode nptr = new TreeNode(val); 
      nptr.left = pop(); 
      nptr.right = pop(); 
      push(nptr); 
     } 
    } 
    catch(Exception e) { 
     System.out.println("Invalid Expression"); 
    } 
} 
    //if it is a valid digit return true 
private boolean isDigit(char ch) { 
    return ch >= '0' && ch <= '9'; 
} 
    //if it is a valid operator return true 
private boolean isOperator(char ch) { 
    return ch == '+' || ch == '-' || ch == '*' || ch == '/'; 
} 

private int toDigit(char ch) { 
    return ch - '0'; 
} 

    //starting from index 0 increment the index after char has been inserted into the tree 
    //and terminate the for loop once we have reached equation legnth 
public void buildTree(String eqn) { 
//   String [] eqnSubparts = eqn.split(" "); 
//   System.out.print("\neqnSubparts: " + eqnSubparts); 

    for (int i = 0; i <= eqn.length() - 1; i++) {    
//     System.out.print("\neqnSubparts: " + eqnSubparts[i]); 
        insert(eqn.charAt(i)); 
      } 
} 

public double evaluate() { 
    return evaluate(peek()); 
} 

public double evaluate(TreeNode ptr) { 
    if (ptr.left == null && ptr.right == null) return toDigit(ptr.data); 
    else { 
     double result = 0.0; 
     double left = evaluate(ptr.left); 
     double right = evaluate(ptr.right); 
     char operator = ptr.data; 
        //switch statment for oper 
     switch (operator) { 
     case '+': 
      result = left + right; 
      break; 
     case '-': 
      result = left - right; 
      break; 
     case '*': 
      result = left * right; 
      break; 
     case '/': 
      result = left/right; 
      break; 
     default: 
      result = left + right; 
      break; 
     } 
     return result; 
    } 
} 

} 

/** class ExpressionTreeTest **/ 
public class ExpressionTreeTest { 
public static void main(String[] args) { 
    Scanner scan = new Scanner(System. in); 
    System.out.println("Expression Tree Test"); 

    /** make object of ExpressionTree **/ 
    ExpressionTree et = new ExpressionTree(); 

    System.out.println("\nEnter equation in prefix form"); 



      //String line = scan.nextLine(); 
      //System.out.print("First digit : " + line); 
      et.buildTree(scan.nextLine()); 


    System.out.print("\nInput : "); 

    System.out.println("\n\nEvaluated Result : " + et.evaluate()); 
} 
} 

答えて

2

は、ユーザーの入力中の文字の各セットの間にスペースがあります。

完全なコード..私は二桁の文字を読むために何をする必要があるか確認してくださいtは?言い換えれば、10スペース3スペース+スペース7のようなものです。そうでない場合は、この形式で入力して、スペースで入力を分割することができます

+0

はい私のユーザ入力にはスペースがあり、1桁の数字だけを入力するとプログラムはうまく動作します – kkmoslehpour

+0

質問が更新され、私のフルコードが追加されました。 – kkmoslehpour

+0

質問に答えてください。私は投票しましたが、答えはありません。 – kkmoslehpour

1

buildTree()メソッドの問題は、各文字方程式のうち、あなたはどこにも空間を考慮していません。 代わりに、String[] eqnSubparts = eqn.split(" ")を使用してスペース内のeqnを分割してから、この配列を反復処理し、配列の各エントリをツリーに挿入します。
注:配列の各エントリを挿入するときに反復処理をしている間に、ツリーにもスペースを挿入する場合は、スペースも挿入します。

+0

質問を更新し、私の完全なコードを追加しました。 charからstringに変更するのは難しいようです。私はそれを変換しようとするとエラーが発生しています。 – kkmoslehpour

+0

文字を挿入メソッド&に渡すことができます。文字をisDigitメソッドに渡すと、その時点で文字列の各文字を反復して渡すことができます。あなたの文字列のすべての文字が満たされたら、if/elseブロックで操作を呼び出します。 –

0

空白に基づいて文字列をトークン化してみませんか?文字別アプローチを使用するのではなく、文字列アプローチで文字列を採用するのはなぜですか? Javaのsplit関数を使用します。

split(" ") 

この関数は、文字列の配列を返します。

10 3 + 7 * ---->これを文字列の配列に格納します。

String arrayOfStrings[]; 
arrayOfStrings = inputString.split(" ") 

私はあなただと思う文字列1 = 10

文字列2 = 3

文字列3 = +

文字列4 = 7

文字列5 = *

個々の文字の代わりに文字列として挿入する必要があります。

+0

これで、insert(arrayOfStrings [i])のようなことを言っていますか? – kkmoslehpour

+0

フルコードを更新しました。 – kkmoslehpour

+0

はい、そうです。文字列を挿入メソッドに渡すことができます。文字でもっと快適にしたい場合は、トークン化された文字列に対してstring.charAt(index)メソッドを使用できます。 – GiteshChopra

関連する問題