表达式评估 - 避免StackOverflow异常

时间:2013-10-14 13:24:51

标签: c# algorithm stack binary-tree

我一直在摆弄我自己的表达评估员并在这个问题上找到了我很好奇。

我使用了两种方法来评估字符串表达式。一种方法使用二叉树。

当我输入一个长度大于(约)42000的表达式字符串时,我得到一个stackoverflow异常。

然而,如果我使用此函数(我的第二个实现)评估相同的表达式字符串(即使更长的长度),也不会发生同样的事情

现在我更愿意坚持使用二进制树方法 - 有没有办法可以修复堆栈溢出异常,即我可以避免递归中的堆栈溢出,或者有没有办法找到堆栈何时实际溢出?如果没有,我甚至可以在表达式开始评估可能发生堆栈溢出之前,至少警告用户?

1 个答案:

答案 0 :(得分:1)

老实说,最好的办法是使用第二种方法。虽然这里可以使用递归,但从算法的角度来看,你提供的堆栈方法更正确 - 主要是因为你的二叉树方法没有办法处理一元运算符(据我所知,至少) (例如,++ i)。

关于你的第一个问题,实际上并没有办法判断是否有东西会从输入中抛出堆栈溢出异常。您最好的选择是在try / catch中将第一次调用包装到递归方法中,并显式捕获StackOverflowException,并向用户返回有效的错误消息。

另外,请记住,理论上,如果您愿意,您可以将二叉树实现移动到使用类似于数字2的堆栈对象。虽然您仍然需要重新设计方法来使用堆栈而不是应用程序的堆栈。