说明:对于一个表达式(比如1+2/(A-B)),如果A-B为0,有时我们想这个表达式返回1,而不是0或者抛出异常。也就是局部的除数异常是允许的。这个时候就需要对公式做容错处理。
下面是用C#的处理过程,如有错误,欢迎指正
/// <summary>
/// 公式容错
/// 在执行公式时,会有除数为0的情况,此时不应该报错,只是包含除数为0的表达式计算结果为0,整个表达式继续执行
/// 如1+(2/(4-8/(1+1))) 执行结果应该是1 而不应该报错
/// 方法:
/// 1:将原表达式转换为后缀表达式
/// 2:再将后缀表达式转换为容错之后的中缀表达式
/// 3:栈顶元素即为结果
/// </summary>
public class FormulasConvert {
//存原始后缀表达式
Stack<char> _suffixStack = new Stack<char>();
/// <summary>
/// 后缀表达式结果
/// </summary>
public string _suffixFormula = string.Empty;
//存容错后中缀表达式
Stack<string> _infixingStack = new Stack<string>();
/// <summary>
/// 容错后中缀表达式结果
/// </summary>
public string _infixingFormula = string.Empty;
/// <summary>
/// 原始公式
/// </summary>
private string _inputFormula = string.Empty;
/// <summary>
/// 用字符转换之后的原始公式
/// 10+10==》A+B
/// </summary>
private string _newFormula = string.Empty;
//操作符
private string _operator = "+-*/()";
/// <summary>
/// 原公式:100+2/300
/// 对应:
/// A:100 B:2 C:300
/// 最终
/// A+B/C
/// </summary>
Dictionary<string, string> _dicCompary = new Dictionary<string, string>();
public FormulasConvert(string inputFormula) {
this._inputFormula = inputFormula;
}
/// <summary>
/// 将原始表达式转换成后缀表达式
/// </summary>
/// <param name="inputString">原中缀表达式</param>
/// <returns></returns>
public string ConvertToSuffix() {
OperatorFormula();
for (int i = 0; i < _newFormula.Length; i++) {
char ch = _newFormula[i];
if (!IsOperator(ch)) {