Java 在将后缀表达式从中缀表达式转换后对其求值

Java 在将后缀表达式从中缀表达式转换后对其求值,java,postfix-notation,infix-notation,Java,Postfix Notation,Infix Notation,我有一个将中缀表达式转换为后缀表达式的代码,之后我想计算表达式并找到值,因此我所做的是要求用户以A+B*C+D的方式输入表达式,然后我使用一种方法将其转换,然后我要求用户输入A、B、C和D的值,以便我可以计算表达式,当用户输入值时,我将它们放在一个字符串数组中并尝试对其求值,但我被困在这里,并尝试了许多方法进行求值,但没有成功!这是我的密码: public class Main { private Stack stack = new Stack(); char symbol;

我有一个将中缀表达式转换为后缀表达式的代码,之后我想计算表达式并找到值,因此我所做的是要求用户以A+B*C+D的方式输入表达式,然后我使用一种方法将其转换,然后我要求用户输入A、B、C和D的值,以便我可以计算表达式,当用户输入值时,我将它们放在一个字符串数组中并尝试对其求值,但我被困在这里,并尝试了许多方法进行求值,但没有成功!这是我的密码:

public class Main {
    private Stack stack = new Stack();
    char symbol;
    String postfix = "";
    String prefix;

///////////////////////////////////////////////////////////////////////////////////////////////

    public char prefixLetterOrOprand(char ch) {
        if (Character.isLetter(ch))
            prefix = ch + prefix;
        else {
            while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek()))
                prefix = stack.pop() + prefix;
            stack.push(ch);
        }
        return ch;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    public String toPostfix(String infix) {
        for (int i = 0; i < infix.length(); ++i) {
            symbol = infix.charAt(i);
            isLetterOrOprand(symbol);
        }
        while (!isEmpty())
            postfix = postfix + stack.pop();
        return postfix;
    }

        ///////////////////////////////////////////////////////////////////////////////////////////////

public int evaluate(String expression, int[] value) {
    String a = convertExpressionToValues(expression, value);
    int sum = 0;
    Stack<Character> operand = new Stack<>();
    Stack<Character> operator = new Stack<>();

    for (int i = 0; i <= expression.length() - 1; i++) {
        if (Character.isLetterOrDigit(expression.charAt(i)) == true) {
            operand.push(a.charAt(i));
            System.out.println("Letters: " + operand.peek());
        } else {
            if (operator.isEmpty()) {
                operator.push(expression.charAt(i));
            }
            if (!operator.isEmpty() && charValue(expression.charAt(i)) >= charValue(operator.peek())) {
                operator.push(expression.charAt(i));
                sum = Integer.parseInt(a);
            }
            System.out.println("Digits: " + operator.peek());
        }
    }
    return sum;
}

private String convertExpressionToValues(String expression, int[] value) {
    StringBuilder a = new StringBuilder(expression);        
    a.replace(a.indexOf("A"), a.indexOf("A") + 1, Integer.toString(value[0]));
    a.replace(a.indexOf("B"), a.indexOf("B") + 1, Integer.toString(value[1]));
    a.replace(a.indexOf("C"), a.indexOf("C") + 1, Integer.toString(value[2]));
    a.replace(a.indexOf("D"), a.indexOf("D") + 1, Integer.toString(value[3]));
    return a.toString();
}

///////////////////////////////////////////////////////////////////////////////////////////////

    public char isLetterOrOprand(char ch) {
        if (Character.isLetter(ch))
            postfix = postfix + ch;
        else {
            while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek()))
                postfix = postfix + stack.pop();
            stack.push(ch);
        }
        return ch;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    public int charValue(char ch) {
        if (ch == '+' || ch == '-')
            return 1;
        else if (ch == '*' || ch == '/')
            return 2;
        return 0;
    }

    public boolean isEmpty() {
        return stack.size() == 0;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Please Enter a value");
        String value = scan.next();
        Main main = new Main();
        System.out.println("Postfix Value: " + main.toPostfix(value));
        System.out.println("-----------------------------------");
        System.out.println("Prefix Value: " + main.toPrefix(value));

        System.out.println("Enter A Value For A: ");
        int a = scan.nextInt();
        System.out.println("Enter A Value For B: ");
        int b = scan.nextInt();
        System.out.println("Enter A Value For C: ");
        int c = scan.nextInt();
        System.out.println("Enter A Value For D: ");
        int d = scan.nextInt();
        int[] values = { a, b, c, d };
        main.evaluate(values);
    }

}
公共类主{
私有堆栈=新堆栈();
字符符号;
字符串后缀=”;
字符串前缀;
///////////////////////////////////////////////////////////////////////////////////////////////
公共字符前置器OROPRAND(字符ch){
if(字符集(ch))
前缀=ch+前缀;
否则{
当(!isEmpty()&&charValue(ch)查看以下代码时:

public int evaluate(int[] value) {
    String a = Arrays.toString(value);
    System.out.println("PREFIDXSS:: " + toPostfix(a));
    return 0;
}
这里的
value
是用户输入的值数组。当您将此数组转换为字符串时,会得到类似
“[1,2,3,4]”
。请注意,这不是中缀表达式,因此将此字符串发送到
toPostfix()
将不起作用,因为该方法希望字符串是正确的中缀表达式

您有一些正确的想法。您需要执行与当前的
toPostfix()
类似的操作。但是,您缺少一条非常重要的信息:要计算的表达式

这里有两个选项:

  • 从中缀转换为后缀时,可以保存表达式的某些表示形式,以便以后用于计算

  • 您可以编写
    toPostfix()的修改形式
    函数,该函数接受两个参数:中缀表达式和变量值数组。此新方法的算法与您的算法非常相似。主要区别在于您需要一个
    堆栈
    ,以便进行实际计算。您还需要在n在中缀运算中遇到运算符符号。最终结果将是数字而不是字符串


  • 我建议您将值保存为数字,而不是字符串,因为您想对它们进行算术运算。您还应该使用
    映射
    ,而不是数组,以便您可以按名称查找值。我已尝试将其堆叠以实现我的目标,但我的charValue(char ch)方法不支持这一点,因此如果有更好的建议,请提供建议。
    charValue()的用途是什么
    method?@code peedient如果我使用数字,我如何找到传递的操作数?转换为后缀的中缀表达式是否有常量或变量?对于第一个选项,我有一个表示表达式的字符串,它是后缀字符串,在调用toPostfix方法后,后缀字符串具有表达式ssion@KhaledJamal要使用后缀字符串,您必须一次解析一个字符。