1

我一直在摆弄自己的表情评估器,并遇到了这个我很好奇的问题。

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

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

但是,如果我使用此函数(我的第二个实现)评估相同的表达式字符串(甚至更长的长度),则不会发生同样的情况

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

4

1 回答 1

1

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

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

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

于 2013-10-14T13:40:03.000 回答