表达式计算 - 避免堆栈溢出异常

本文关键字:堆栈 栈溢出 异常 计算 表达式 | 更新日期: 2023-09-27 18:35:12

我一直在摆弄自己的表达式评估器,并发现了我好奇的这个问题。

我使用了 2 种方法来计算字符串表达式。一种方法使用二叉树。

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

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

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

表达式计算 - 避免堆栈溢出异常

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

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

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