0

我正在尝试编写一个评估后缀算术表达式的程序。该程序向我的函数发送一个字符串evaluatePostfix,该函数继续识别操作数和运算符并得出一个整数解。我在这个程序中操作堆栈,方法是在识别时推送扫描的字符,当然在需要评估时执行适当的弹出函数。但现在,我遇到了一个问题,程序挂在似乎是无限循环的地方。我想我不确定如何告诉函数在评估第一个字符后继续处理字符串中的下一个字符。另一件需要注意的是,用户在每个操作数和运算符之间放置一个空格。这是我的功能:

int evaluatePostfix(char *postfixStr)
{
    stack * s;
    int x, y;

    stackInit(&s);

    do {
        if(isOperand(postfixStr) == 1) {
            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);
        }

    } while (postfixStr != NULL);
    return stackPop(s);
}

我知道操纵堆栈的函数是正确的,因为它们是由我的导师提供的。有人可以给我一个关于我缺少什么的线索吗?

4

1 回答 1

0

您可以将while条件更改为while (++postfixStr != NULL)以将指针递增到 中的下一个字符postfixStr

此增量是使用前缀符号 ( ++varvs var++) 完成的,以便将下一个字符与NULL. 我不熟悉您正在使用的堆栈函数的行为,但我建议将do { ... } while (++postfixStr != NULL);循环更改为循环,并在 while 循环块的末尾while (postfixStr != NULL) { ... }递增。postfixStr

最安全的做法是在函数中添加字符串长度参数:

int evaluatePostfix(char *postfixStr, int strLength)

You would then use a loop that explicitly steps from the beginning of the string at index 0 to index strLength - 1, which would safely handle empty and non-NULL-terminated strings.

于 2012-02-19T03:23:03.213 回答