我以前的問題都可以在這裏找到(只是想提供保證這個最有幫助的社區,我不是垃圾郵件的問題):評價在C(新發行)後綴表達式
Evaluating a postfix Expression in C
我的問題涉及評估後綴表達式。說我有一個後綴表達式如:
3 2 1 2 +^^
我試圖存儲在堆棧中的值(作爲輸入的字符的字符串的所有用戶),並通過使用其他函數,我打算評估它,最終結果是堆棧中唯一剩下的元素被彈出並呈現。在Code Blocks中調試器擺弄了幾個小時之後,我發現這個函數並沒有在堆棧中存儲任何東西。此外,當我使用我的函數來檢查被指向的字符是否是操作數時,儘管它是一個操作數,它會忽略它應該採取的適當操作。下面是我使用與isOperand函數的代碼包括在內:
bool isOperand(char *str)
{
/** For value 3, str seems to be the entire character string
being "3 2 1 2 +^^" **/
return isdigit(str) != 0;
}
int evaluatePostfix(char *postfixStr)
{
stack * s;
int x, y, z;
stackInit(&s);
while(postfixStr != NULL) {
/** For the first value 3, it SHOULD be an operand and
proceed to push it on the stack. But it just skips
this condition. **/
if(isOperand(postfixStr)) {
stackPush(&s, postfixStr);
}
if(isOperator(postfixStr) == 1) {
y = atoi(stackPop(&s));
x = atoi(stackPop(&s));
char *str = malloc(10 * sizeof(char));
sprintf(str, "%d", applyOperator(x, y, postfixStr));
stackPush(&s, str);
}
++postfixStr;
}
z = stackPop(s);
stackDestroy(&s);
return z;
}
我不知道如何在指針顯然是把它僅僅是一個值。而在這種情況下,它是兩位甚至三位數字,我怎麼能告訴程序識別?再次感謝您的時間,我非常感謝所有人提供的幫助。
****編輯/發現的解決方案****
好,因爲我不允許回答我的問題仍然是一個「新用戶」,我反而會修改原來的職位,使也許這將對未來的其他人有用。
看起來這裏的標記化是合適的情況。通過使用
的strtok(串,分隔符)
功能斷線成什麼似乎是空字符的空間在中間隔開較小的字符串。我仍然不是100%確定是否因爲我使用了字符串空間的分隔符(又名「」),但無論如何。
終止與
令牌= strtok的環路(NULL,「「);
,而不是由1件作品不夠好遞增指針,因爲它似乎是採取原始字符串和直接修改它時,它完全由從原始字符串除去它推動小串部分入堆棧。雖然不是好的做法(因爲我應該創建一個原始字符串的副本,以保持輸入的完整性,我感覺並修改了副本),但我相信這將適用於此項目的範圍。我只是想分享我的發現,以防將來可能對任何人有用。另外,如果在我的使用描述中有一些需要糾正的情況,我想盡一切辦法來解決。
謝謝你,這是有道理的,但你碰巧知道爲什麼初始調用isOperand函數是否將整個字符串考慮在內?當我運行調試器時,它調用了「3 2 1 2 +^^」上的isdigit而不是3:/ – RedMageKnight 2012-02-19 22:46:17
。對於我來說,調試器被實體的實際類型與類型混淆了,重新使用。它知道'postfixStr'是一個字符串/指向(一個數組)的字符串,因此它將它打印出來,而不是作爲'isdigit'解釋的類型'int'。 – 2012-02-19 22:55:55
所以當我嘗試添加astrix時,它給了我一個分段錯誤。對我來說沒有意義,爲什麼我不想立即引用指針值?換句話說,你的方式對我來說很合理,但它不起作用。 – RedMageKnight 2012-02-19 23:06:46