在C中评估后缀表达式

我正在尝试编写一个评估后缀算术表达式的程序。 程序将一个字符串发送到我的函数evaluatePostfix ,后者继续识别操作数和运算符并提出整数解。 我通过在识别时按下扫描的字符来操作此程序中的堆栈,当然在需要评估时执行适当的pop函数。 但是现在,我遇到的问题是程序挂起似乎是一个无限循环。 我想我不确定如何告诉函数在评估第一个字符后继续执行字符串中的下一个字符。 另一点需要注意的是,用户在每个操作数和操作符之间放置一个空格。 这是我的function:

 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); } 

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

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

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

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

 int evaluatePostfix(char *postfixStr, int strLength) 

然后,您将使用一个循环,该循环从索引0处的字符串开头显式步进到索引strLength - 1 ,这将安全地处理空和非NULL终止的字符串。