2012-02-19 78 views
0

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

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

您可以将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终止的字符串。

+0

我按照你的建议做了,并摆脱了常规while循环的do-while循环,并在循环结尾增加了postfixStr。然而,这样做后,应用程序崩溃,我不明白为什么。我修改了代码以在函数结束时销毁堆栈,因为我认为也许是不自由的内存导致了一个问题......但没有运气。也许有任何想法? – RedMageKnight 2012-02-19 04:04:13

+0

当它崩溃时,你收到什么错误信息?您是否通过调试器运行代码或添加了调试打印语句以查找崩溃发生的位置? – ardnew 2012-02-19 06:38:01

+0

这似乎是一个Windows错误发生,它不会给我任何明确的错误消息,当它发生;它只是在输入我的后缀表达式并按回车键之后。当我说这些时,我并不是说听起来像一个完整的dolt,但我似乎无法弄清楚如何在代码块(这是我使用的IDE)中进行调试。我只知道如何在BlueJ,Eclipse和Netbeans中进行调试,但将这些配置为编译C的代码变得非常痛苦,所以我选择了代码块。我会看看如果我不能解决这个问题:/ – RedMageKnight 2012-02-19 18:10:07