Java 构建表示前缀表达式的树的算法
我正在开发一个计算算术前缀表达式的java程序。它接受用户将输入的普通算术表达式,然后将其转换为前缀形式。 例如,如果输入以下表达式:3+(5+9)*2,则会将其转换为: +3*+592。然后将其存储在表达式树中。 我正在搜索一种算法,以便在树中正确存储前缀表达式我使用一个具有char值的节点和两个节点作为类属性。 我已经做了所有的工作来计算表达式(使用树),我只需要将前缀表达式存储在树中。 如果您对java实现有任何建议,它会更好。谢谢 节点类:Java 构建表示前缀表达式的树的算法,java,algorithm,tree,Java,Algorithm,Tree,我正在开发一个计算算术前缀表达式的java程序。它接受用户将输入的普通算术表达式,然后将其转换为前缀形式。 例如,如果输入以下表达式:3+(5+9)*2,则会将其转换为: +3*+592。然后将其存储在表达式树中。 我正在搜索一种算法,以便在树中正确存储前缀表达式我使用一个具有char值的节点和两个节点作为类属性。 我已经做了所有的工作来计算表达式(使用树),我只需要将前缀表达式存储在树中。 如果您对java实现有任何建议,它会更好。谢谢 节点类: public class Noeud { St
public class Noeud
{
String value;
static Noeud right;
static Noeud left;
// Constructors
public Noeud()
{
this.value = "";
this.right = this.left = null;
}
public Noeud(String operation)
{
this.value = operation;
this.right = this.left = null;
}
public Noeud(String operation, Noeud filsdroit, Noeud filsgauche)
{
this.value = operation;
this.right = filsdroit;
this.left = filsgauche;
}
// Methods
public void ajouteGauche(String caractere) // to add the left child
{
Noeud gauche = new Noeud(caractere);
this.left = gauche;
}
public void ajouteDroite(String caractere) // to add the right child
{
Noeud droite = new Noeud(caractere);
this.right = droite;
}
public boolean isLeaf()
{
return this.right == null && this.left == null;
}
// toString
}
这就是我的程序将要做的:
public static void main(String[] args)
{
System.out.println("Input a infix arithmetic expression");
Scanner scan = new Scanner(System.in);
String expInitiale = scan.nextLine();
expInitiale = infixToPreFix(expInitiale).toString();
System.out.println("Votre expression en forme préfixe " + expInitiale);
/* Building the tree (That's what i need) */
Noeud root = constructTree(expInitiale);
// Evaluation of the expression
double result = eval(root);
System.out.prinln("The result is" + result );
}
}
实际上,从左到右解析字符串:
public class Parser {
private final String prefix;
int pos = 0;
public Parser(String prefix) {
this.prefix = prefix;
}
public Noeud parse() {
char c = prefix.charAt(pos);
pos++;
String token = Character.toString(c);
if (Character.isDigit(c)) {
return new Noeud(token);
}
return new Noeud(token, parse(), parse());
}
}
读取节点的基本算法是:
- 读取一个字符(下一个标记)
- 如果该字符是数字,则返回一个新的叶节点
- 否则,再读取两个节点,并使用这些节点作为左和右子节点构造一个新节点
constructTree
函数如下:
public static Noeud constructTree(String prefix) {
return new Parser(prefix).parse();
}
实际上,从左到右解析字符串:
public class Parser {
private final String prefix;
int pos = 0;
public Parser(String prefix) {
this.prefix = prefix;
}
public Noeud parse() {
char c = prefix.charAt(pos);
pos++;
String token = Character.toString(c);
if (Character.isDigit(c)) {
return new Noeud(token);
}
return new Noeud(token, parse(), parse());
}
}
读取节点的基本算法是:
- 读取一个字符(下一个标记)
- 如果该字符是数字,则返回一个新的叶节点
- 否则,再读取两个节点,并使用这些节点作为左和右子节点构造一个新节点
constructTree
函数如下:
public static Noeud constructTree(String prefix) {
return new Parser(prefix).parse();
}
你有什么?前缀表达式?还是中缀表达式?你有从中缀转换成前缀的代码吗?是否需要有关将前缀表达式转换为树的代码的帮助?谢谢您的编辑。你能给我们看一下你的节点类吗?首先,用户输入一个中缀表达式,我的程序将它转换成前缀表达式。然后将前缀表达式存储在树中并对其求值,最后返回一个值。问题是:我不知道如何将前缀表达式存储在树型目录中。现在很清楚你的程序是做什么的,你的问题是什么。你有什么?前缀表达式?还是中缀表达式?你有从中缀转换成前缀的代码吗?是否需要有关将前缀表达式转换为树的代码的帮助?谢谢您的编辑。你能给我们看一下你的节点类吗?首先,用户输入一个中缀表达式,我的程序将它转换成前缀表达式。然后将前缀表达式存储在树中并对其求值,最后返回一个值。问题是:我不知道如何将前缀表达式存储在树型目录中。现在,您的程序的功能和问题已经很清楚了。当我运行程序时,它返回以下错误:线程“main”java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:java.base/java.lang.StringLatin1.charAt处的8(StringLatin1.java:47)Parser处的java.base/java.lang.String.charAt(String.java:693)Parser.parse(Parser.java:12)Parser.parse(Parser.java:18)Parser.parse(Parser.java:18)Main.constructTree(Main.java:86)Main.Main(Main.java:20)您将什么传递给
constructTree
?我将前缀表达式传递给constructTree。前缀表达式的值?您可以在这里找到我的所有程序:当我运行程序时,它返回以下错误:线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)处java.base/java.lang.String.charAt(String.java:693)处Parser.parse(Parser.java:12)处Parser.parse(Parser.java:18)处Parser.parse(Parser.java:18)在Main.constructTree(Main.java:86)在Main.Main(Main.java:20)你将什么传递给constructTree
?我将前缀表达式传递给constructTree。前缀表达式的值?你可以在这里找到我的所有程序: