![](/img/trans.png)
[英]Unkown characters in place of operators in the output for Infix to Postfix conversion
[英]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.