繁体   English   中英

运算符在后缀到后缀转换中的优先级

[英]Precedence of operators in infix to postfix conversion

我正在用C创建一个程序,该程序使用反向精简算法通过堆栈实现将infix形式的表达式转换为postfix形式。 但是,我在如何放置与堆栈的最高元素具有相同优先级的传入令牌方面遇到了麻烦。 例如,给定后缀形式:(a + bc / d + e ^ f ^ 2),后缀形式应为:ab + cd / -ef2 ^^ +。 但是,我的程序输出:ab + cd / -ef ^ 2 ^ +。 我认为问题出在我的代码的这一部分:

while(priority(token) <= priority(top_elem(&S)) && !isStackEmpty(&S)){
    x = POP(&S);
    printf("%c", x);
}
PUSH(&S, token);

顺便说一下,这部分仅针对运算符('+','-',' ','/','^)和右括号执行。 优先级函数对于开括号返回0,对于'+'和'-'返回1,对于' '和'/'返回2,对于'^'返回3。

我想知道我应该在程序中进行哪些更改。 不过,对于其他输入,它执行得很好。

您有一个关联性问题: (a * b) * c == a * (b * c)成立,而powerTo(或^ )却不成立: (a ^ b) ^ c != a ^ (b ^ c)

当它们的优先级匹配时,您需要为每个操作数解决此问题:

while(!isStackEmpty(&S) &&
      (priority(token) < priority(top_elem(&S)) ||
       priority(token) == priority(top_elem(&S)) && !isRightAsoc(token)))
{
    x = POP(&S);
    printf("%c", x);
}
PUSH(&S, token);

最简单的解决方案是为所有运算符赋予两个优先级值:左优先级和右优先级。 您总是将符号在堆栈上的左优先​​级与输入符号的右优先级进行比较。

分配值的一种方法是使所有左优先级为偶数而使所有右优先级为奇数。 右优先级将比左优先级大一或小,这取决于操作员的关联性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM