当前位置: 首页 > 知识库问答 >
问题:

中缀后缀表达式中的关联规则

金阳曜
2023-03-14

使用堆栈中缀后缀算法:

static int Prec(char ch) {
    switch (ch) {
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
        return 2;
    case '^':
        return 3;
    }
    return -1;
}

static String infixToPostfix(String exp) {
    String result = new String("");
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < exp.length(); ++i) {
        char c = exp.charAt(i);
        if (Character.isLetterOrDigit(c))
            result += c;
        else if (c == '(')
            stack.push(c);
        else if (c == ')') {
            while (!stack.isEmpty() && stack.peek() != '(')
                result += stack.pop();
            stack.pop();
        } else {
            while (!stack.isEmpty() && Prec(c) <= Prec(stack.peek())) {
                result += stack.pop();
            }
            stack.push(c);
        }
    }
    while (!stack.isEmpty()) {
        if (stack.peek() == '(')
            return "Invalid Expression";
        result += stack.pop();
    }
    return result;
}

输入:k+L-m*n+(O^p)*W/u/v*t+q^j^a

预期输出:kl+mn*-op^w*u/v/t*+qja^^+

实际输出:kl+mn*-op^w*u/v/t*+qj^a^+

如果当前运算符和堆栈顶部的运算符具有相同的优先级,则检查它们的相关性,

    null
    null

然而,我的代码不适合于关联。有人能解释一下在上面的实现中如何处理关联性吗?

共有1个答案

岑畅
2023-03-14

这是一个简单的解决办法。您需要从以下位置更新while循环条件:

while (!stack.isEmpty() && Prec(c) <= Prec(stack.peek()))

致:

while (!stack.isEmpty() && (prec(c) < prec(stack.peek()) || (prec(c) == prec(stack.peek()) && isLeftToRightAssociative(stack.peek()))))

下面是IslefttorightAssociative():

public static boolean isLeftToRightAssociative(Character operator)
{
    //You can also use return operator != '^' as an alternative to the if-else given below
    if (operator == '^') return false;
    else return true;      
}

我应该补充一点,如果用户输入包含一元运算符的表达式,您的代码将不会产生正确的输出。如果要使用一元运算符,则应更新代码。

 类似资料:
  • 本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。

  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 本文向大家介绍将中缀转换为后缀表达式,包括了将中缀转换为后缀表达式的使用技巧和注意事项,需要的朋友参考一下 前缀表达式是人类可读和可解的。我们可以轻松地区分算子的顺序,也可以在计算数学表达式时先使用括号将其求解。计算机无法轻松地区分运算符和括号,这就是为什么需要后缀转换的原因。 要将中缀表达式转换为后缀表达式,我们将使用堆栈数据结构。通过从左到右扫描infix表达式,当我们得到任何操作数时,只需将

  • 我正在讨论中缀、前缀和后缀的转换,我对以下表达式有疑问: 中缀: 下面的转换是我脑海中的转换。但是,下面的前缀表达式与联机转换工具不匹配 前缀: 后缀: 当我在一些在线转换器中,甚至在我写的代码中放入上述infix时,我得到: infix: 前缀: Postfix: 所以,我在这里的问题是,如果我们要计算上面的前缀,那么我们将在加法之前做减法,这在我看来是不正确的,因为根据运算符的关联性加法应该首

  • 本文向大家介绍数据结构中的前缀和后缀表达式,包括了数据结构中的前缀和后缀表达式的使用技巧和注意事项,需要的朋友参考一下 编写算术表达式的方法称为符号。算术表达式可以用三种不同但等效的符号表示,即,无需更改表达式的本质或输出。这些符号是– 中缀 字首 后缀 缀符号是正常的符号,我们在编写不同的数学表达式时会使用它们。前缀和后缀表示法有很大不同。 前缀符号 在这种表示法中,运算符以操作数为前缀,即运算

  • 本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使