在C中评估PostFix表达式(新问题)

时间:2012-02-19 22:01:53

标签: c postfix-notation

我之前的问题可以在这里找到(只是想向这个最有帮助的社区提供保证,我不会试图垃圾邮件问题):

Evaluating a postfix Expression in C

我的问题涉及评估后缀表达式。假设我有一个后缀表达式,例如:

  

3 2 1 2 + ^ ^

我正在尝试将值(所有用户输入为字符串)存储在堆栈中并通过使用其他函数,我打算用最终结果进行评估,这是堆栈中唯一剩余的元素被弹出并呈现。经过几个小时摆弄代码块中的调试器后,我发现该函数没有在堆栈中存储任何东西。此外,当我使用我的函数来检查被指向的字符是否是操作数时,尽管它是一个操作数,它忽略了应该采取的适当操作。这是我正在使用的代码,包括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( string delimiter

该函数将字符串分解为较小的字符串,这些字符串由空格之间的空字符分隔。我仍然不能100%确定是否因为我使用了字符串空间的分隔符(又名“”),但无论如何。

使用

结束循环
  

token = strtok(NULL,“”);

而不是将指针递增1可以很好地工作,因为它似乎采用原始字符串并在通过将较小的字符串部分从原始字符串中完全删除而将较小的字符串部分推入堆栈时直接修改它。虽然不是很好的做法(因为我应该创建一个原始字符串的副本,以保持我感觉和修改副本的输入的完整性),我相信它将适用于该项目的范围。我只想分享我的发现,以防将来可能对任何人有用。另外,如果我的使用说明中有些东西需要纠正,无论如何,我很想知道。

1 个答案:

答案 0 :(得分:1)

你在指针上调用isdigit

return isdigit(str) != 0;

应该在指针对象上调用

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