后缀转换器中中缀符号的错误

问题描述

在编写应用程序时,我需要执行输入的算术运算。词法分析器部分以中缀表示法返回算术表达式,而要执行进一步的操作,最好使用后缀(反向波兰语)表示法。通常,我需要一个堆栈,其中紧跟在操作符号之后的参数将是应该应用该操作的参数,可能是嵌套的。

我写了我想到的最简单的翻译实现,但出现错误,只是找不到来源。

给出显式错误的输入示例:1+2*3-4/(5*6) 我的实现输出是:12+3*4-56*/ 正确的必须是:123*+456*/-

这是主要代码,它使用带有源数据的中缀 Stack 和后缀 StringBuilder 作为答案:

    for (int i = 0; i < element.length(); i++) {
        char st = element.charat(i);

        if (!(st == ' ' || st == ',')) {
            if (st == '+' || st == '-' || st == '*' || st == '/') {
                while (!infix.isEmpty() && infix.peek() != '(' && operatorWeight(infix.peek()) >= operatorWeight(st)) {
                    postfix.append(infix.pop());
                }
                infix.push(st);
            } else if (st >= '0' && st <= '9') {
                postfix.append(st);
            } else if (st == '(') {
                infix.push(st);
            } else if (st == ')') {
                while (!infix.isEmpty() && infix.peek() != '(') {
                    postfix.append(infix.pop());
                }
                infix.pop();
            }
        }
    }
    while (!infix.isEmpty() && infix.peek() != '(') {
        postfix.append(infix.peek());
        infix.pop();
    }

这里有一个辅助函数,可以更容易地比较运算符:

public int operatorWeight(char st) {
    int weight = -1;
    switch (st) {
        case '+':
        case '-':
            weight = 0;
        case '*':
        case '/':
            weight = 1;
    }
    return weight;
}

可能被条件搞砸了

解决方法

您在运算符比较开关块中缺少 break 语句。

public int operatorWeight(char st) {
    int weight = -1;
    switch (st) {
        case '+':
        case '-':
            weight = 0;
           break;
        case '*':
        case '/':
            weight = 1;
            break;
    }
    return weight;
}