0

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

在 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(字符串分隔符

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

结束循环

令牌 = strtok(NULL, " ");

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

4

1 回答 1

1

你在调用isdigit一个指针,

return isdigit(str) != 0;

应该在指针上调用,

return isdigit(*str) != 0; // or, equivalently: return isdigit(*str);
于 2012-02-19T22:16:15.810 回答