我一直在摆弄我自己的表达评估员并在这个问题上找到了我很好奇。
我使用了两种方法来评估字符串表达式。一种方法使用二叉树。
当我输入一个长度大于(约)42000的表达式字符串时,我得到一个stackoverflow异常。
然而,如果我使用此函数(我的第二个实现)评估相同的表达式字符串(即使多更长的长度),也不会发生同样的事情
现在我更愿意坚持使用二进制树方法 - 有没有办法可以修复堆栈溢出异常,即我可以避免递归中的堆栈溢出,或者有没有办法找到堆栈何时实际溢出?如果没有,我甚至可以在表达式开始评估可能发生堆栈溢出之前,至少警告用户?
答案 0 :(得分:1)
老实说,最好的办法是使用第二种方法。虽然这里可以使用递归,但从算法的角度来看,你提供的堆栈方法更正确 - 主要是因为你的二叉树方法没有办法处理一元运算符(据我所知,至少) (例如,++ i)。
关于你的第一个问题,实际上并没有办法判断是否有东西会从输入中抛出堆栈溢出异常。您最好的选择是在try / catch中将第一次调用包装到递归方法中,并显式捕获StackOverflowException,并向用户返回有效的错误消息。
另外,请记住,理论上,如果您愿意,您可以将二叉树实现移动到使用类似于数字2的堆栈对象。虽然您仍然需要重新设计方法来使用堆栈而不是应用程序的堆栈。