我正在尝试编写一个评估后缀算术表达式的程序。程序将一个字符串发送到我的函数evaluatePostfix
,后者继续识别操作数和运算符,并提出整数解。我通过在识别时按下扫描的字符来操作此程序中的堆栈,当然还需要在需要评估时执行相应的pop函数。但是现在,我遇到的问题是程序挂起似乎是一个无限循环。我想我不确定如何告诉函数在评估第一个字符后继续执行字符串中的下一个字符。另一件需要注意的是,用户在每个操作数和操作符之间放置一个空格。这是我的功能:
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);
}
我知道操纵堆栈的函数是正确的,因为它们是由我的教师提供的。有人可能会给我一个关于我缺少什么的线索吗?
答案 0 :(得分:0)
您可以将while
条件更改为while (++postfixStr != NULL)
,以将指针增加到postfixStr
中的下一个字符。
此增量使用前缀表示法(++var
vs var++
)完成,以便将下一个字符与NULL
进行比较。我不熟悉您正在使用的堆栈函数的行为,但我建议将do { ... } while (++postfixStr != NULL);
循环更改为while (postfixStr != NULL) { ... }
循环,并在结尾处增加postfixStr
while loop的块。
最安全的做法是在函数中添加一个字符串长度参数:
int evaluatePostfix(char *postfixStr, int strLength)
然后,您将使用一个循环,该循环从索引0
处的字符串的开头显式步骤到索引strLength - 1
,这将安全地处理空和非NULL终止的字符串。