2013-10-14 103 views
1

我一直在摆弄我自己的表达式求值器,并在这个我很好奇的问题上登陆。表达式评估 - 避免StackOverflow异常

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

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

但是同样的,如果我使用此功能(我的第二个实现)

现在我宁愿坚持二叉树方法评估相同的表达式字符串(甚至更长的长度)不会发生 - 有没有办法我可以修复堆栈溢出异常,即我可以避免我的堆栈溢出递归还是有办法找到何时堆栈实际上溢出?如果不是,即使表达式开始评估堆栈溢出可能发生之前,我怎么才能实际上至少警告用户?

+0

你有没有考虑重新分析你的字符串以反转波兰表示法(http://en.wikipedia.org/wiki/Reverse_Polish_notation),这将允许你用少得多的复杂度来做到这一点 – MikeT

+0

什么参数'字符串strPostFix'对你来说意味着什么? – Sadique

+0

我确实想知道,在这种情况下,你的二叉树不幸是完全错误的方法来处理这个,它的Bodmas风格的数学需要树分析。所以你的第二个解决方案是正确的一个 – MikeT

回答

1

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

至于你的第一个问题,没有一个真正的方法来判断是否有东西会从刚才的输入中抛出堆栈溢出异常。你最好的选择是将try/catch中的递归方法的第一个调用包装起来,并明确地捕获StackOverflowException,并向用户返回一个有效的错误消息。另外,请记住,如果需要,理论上可以将二叉树实现移至使用类似于数字2的堆栈对象。尽管您仍然需要重新设计使用堆栈而不是应用程序堆栈的方法。