【问题标题】:Precedence of operators in infix to postfix conversion中缀到后缀转换中运算符的优先级
【发布时间】:2015-09-16 03:26:25
【问题描述】:

我正在用 C 语言创建一个程序,该程序通过堆栈实现使用反向抛光算法将中缀形式的表达式转换为后缀形式。但是,我在如何放置与堆栈最顶层元素具有相同优先级的传入令牌时遇到问题。例如,给定中缀形式:(a+b-c/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。

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

【问题讨论】:

  • 为了可读性和分隔标记,您强烈应该在元素之间添加空格。考虑12+:是1 2 + 还是12 +
  • 我正在制作的程序中的操作数仅限于数字0-9和单个字母。
  • 这仍然是一个好主意,用于调试。这真的很容易:只需在每个输出标记后打印一个空格(行尾的那个无关紧要)。

标签: c stack operator-precedence


【解决方案1】:

你有一个关联性问题:虽然(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);

【讨论】:

  • 哦,是的,我完全忘记了关联性。我尝试按照您的建议进行操作,但结果如下:abcd/ef2^^+-+.
  • 再次,像这样,您只需将所有运算符视为右关联:a+b-c/d+e^f^2 => a+(b-((c/d)+(e^(f^2))))。现在看它,我注意到您必须同时处理左关联和右关联,因为+- 之间的优先级是左关联的。你应该得到(((a+b)-(c/d))+(e^(f^2)))
【解决方案2】:

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

分配值的一种方法是使所有左优先级为偶数,所有右优先级为奇数。右优先级将比左优先级多一或少一,具体取决于运算符的关联性。

【讨论】:

  • @beyeler:因为 * 和 / 都具有相同的优先级值,所以 a/b*c/d 的解析就像 a/b/c/d 一样。为什么会有问题?
猜你喜欢
  • 2021-10-25
  • 2016-06-07
  • 2018-08-22
  • 2019-11-06
  • 2014-02-24
  • 2011-08-30
  • 2019-02-13
  • 2019-06-10
  • 2011-11-28
相关资源
最近更新 更多