我正在用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。
我想知道我的程序应该改变什么。但是,它对其他输入执行正常。
答案 0 :(得分:2)
您遇到关联问题:虽然(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);
答案 1 :(得分:2)
最简单的解决方案是为所有运算符赋予两个优先级值:左优先级和右优先级。您始终将堆栈上符号的左优先级与输入符号的右优先级进行比较。
分配值的一种方法是使所有左优先级均匀,所有优先级优先级为奇数。正确的优先级将比左优先级多一个或一个,具体取决于运算符的关联性。