这是一道简单的java作业题,实在是无从下手,请高手指导一下,如果能帮助写出较好的代码,追加50分!(可以百度Hi我~)
题目要求是:将算术表达式(含括号)改写成中序表达的二叉树。
已给了整个程序的结构。
一个Expression类,作为所有表达式类型的抽象父类。
一个Constants类,是Expression的子类之一,表示算术式中的常量。
一个Variable类,是Expression的子类之一,表示算术式中的变量。
一个OperatorExpression类,是Expression的子类之一,表示算术式中的运算符号。
除此以外,还有assignVariables类,用于给变量赋值。
还有最重要的类叫做Parser,用于分解这个算术表达式。这个类要利用前面的Expression来判断分解出来的是什么类型。
我自己尝试写了一下,但是对于Parser我没有概念,因为老师给出的方法是返回Expression类型,我到底应该怎么写呢?
请各位高手帮帮忙哦!能帮我写出完整代码的还有追加~~
以下是我写的,肯定有很多不对的地方(尤其是每个子类的givValue方法是我猜的~ 其他的方法是老师规定的):
abstract class Expression {
public abstract int givValue(assignVariables variables);
}
public class Constants extends Expression {
private int Constants;
public Constants(int Constants) {
this.Constants = Constants;
}
public int givValue(assignVariables variables){
return this.Constants;
}
}
public class Variable extends Expression{
private String variable;
private int constants;
public Variable(String variable){
this.variable = variable;
}
public int givValue(assignVariables variables){
return this.constants;
}
}
public class OperatorExpression extends Expression{
private Expression expression1;
private char operator;
private Expression expression2;
private int constants;
public OperatorExpression(Expression expression1, char operator, Expression expression2){
this.expression1 = expression1;
this.operator = operator;
this.expression2 = expression2;
}
public int givValue(assignVariables variables){
return this.constants;
}
}
public class assignVariables {
private String variable;
private int value;
public assignVariables(){
}
public void assignValue(String variable, int value){
this.variable = variable;
this.value = value;
}
public int givValue(String variables){
return this.value;
}
}
public class Parser {
public Expression parse(String expression){
}
}
是要转化成中序的二叉树形式,给一个例子:
(ab + 1) ∗ 5/(b + 201 ∗ (a − b))
转化成插入图片中的二叉树的样子
其次,在表达式的拆分过程中应该把各变量,常量的位置记录下来,运算符的位置和优先级(这个很重要)记录下来。也就是在你的各个类中加一个记录位置的成员变量。
最后根据优先级从高到低,从左到右的输出。比如你的例子中:+ × / 和后面括号里的在同一优先级。那么按照从左到右的顺序输出,也可以存到二叉树结构里去。对于括号里的你也可以看做是一个表达式,直接作为一个子树处理
当然这只是我看了之后想到一些,估计写的时候还是会有一些问题。说的不好,请不要见怪。
如a+b*c-123+(d+e)*12
转化为(((a+(b*c))-123)+((d+e)*12)) .....(这个只是输出形式,实际上在内存里是二叉树)
由于代码很多(没有自动构造解析器,纯手工解析字符串并且支持字节码编译)故代码两很大这里放不下。如果有需要hi我或者留下邮箱我给你我这份(白天在公司hi不了)。