2012-02-19 64 views
0

我以前的問題都可以在這裏找到(只是想提供保證這個最有幫助的社區,我不是垃圾郵件的問題):評價在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件作品不夠好遞增指針,因爲它似乎是採取原始字符串和直接修改它時,它完全由從原始字符串除去它推動小串部分入堆棧。雖然不是好的做法(因爲我應該創建一個原始字符串的副本,以保持輸入的完整性,我感覺並修改了副本),但我相信這將適用於此項目的範圍。我只是想分享我的發現,以防將來可能對任何人有用。另外,如果在我的使用描述中有一些需要糾正的情況,我想盡一切辦法來解決。

回答

1

你調用一個指針isdigit

return isdigit(str) != 0; 

,應該在指針對象調用,

return isdigit(*str) != 0; // or, equivalently: return isdigit(*str); 
+0

謝謝你,這是有道理的,但你碰巧知道爲什麼初始調用isOperand函數是否將整個字符串考慮在內?當我運行調試器時,它調用了「3 2 1 2 +^^」上的isdigit而不是3:/ – RedMageKnight 2012-02-19 22:46:17

+0

。對於我來說,調試器被實體的實際類型與類型混淆了,重新使用。它知道'postfixStr'是一個字符串/指向(一個數組)的字符串,因此它將它打印出來,而不是作爲'isdigit'解釋的類型'int'。 – 2012-02-19 22:55:55

+0

所以當我嘗試添加astrix時,它給了我一個分段錯誤。對我來說沒有意義,爲什麼我不想立即引用指針值?換句話說,你的方式對我來說很合理,但它不起作用。 – RedMageKnight 2012-02-19 23:06:46