如何使用 C# 基于 Web 表单的优先级计算表达式

本文关键字:优先级 计算 表达式 表单 Web 何使用 基于 | 更新日期: 2023-09-27 18:19:35

string expr = Text1.Text;
string[] num = Regex.Split(expr, @"'(|')|'-|'+|'*|'/").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for numbers
string[] op = Regex.Split(expr, @"'(|')|'d{1,3}").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for mathematical operators +,-,/,*
int firstVal = 0;
int numCtr = 0;            
int lastVal = 0;   
string  lastOp = ""; 
int num2Cntr = 0;
foreach (string n in num)
{
    numCtr++;
    if (numCtr == 1)
    {
       lastVal = int.Parse(n); 
    }      
    else
    {
        if (!String.IsNullOrEmpty(lastOp)) 
    {
    switch (lastOp)
    {
    case "+":
    lastVal = lastVal + int.Parse(n) ;
    break;
    case "-":
    lastVal = lastVal - int.Parse(n);
    break;
    case "*":
    lastVal = lastVal * int.Parse(n);
    break;
    case "/":
    lastVal = lastVal / int.Parse(n);
    break;
    case "(":
    numCtr++;
    foreach (string a in num)
    {
    num2Cntr++;
    if (num2Cntr == 1)
    {
    firstVal = int.Parse(a);
    }
    else
    {
    if (!String.IsNullOrEmpty(lastOp))
    {
    switch (lastOp)
    {
    case "+":                                             firstVal = firstVal + int.Parse(a);
                                        break;
case "-":
                                        firstVal = firstVal - int.Parse(a);
                                        break;
case "*":
                                        firstVal = firstVal * int.Parse(a);
                                        break;
case "/":
                                        firstVal = firstVal / int.Parse(a);
                                        break;
    }
       }
      }    
     }
break;
case ")":
lastVal = lastVal + firstVal;
return;
}
   }
  }
int opCtr = 0;
foreach (string o in op)
{
opCtr++;
if (opCtr == numCtr) 
{ 
lastOp = o; 
break;
}
}
}
Text2.Text = lastVal.ToString();

1(如何将括号的优先级设置得很高?2(我正在尝试设置优先级,因为输入的表达式的计算结果应该像二叉树一样。首先,括号的优先级必须很高,然后是运算符的优先级。3(我上面的代码工作正常,从左到右计算表达式。 即 5+6+7=18 但是如果我给出 5+(5+5(+(5*2(,我得到的结果是 40。但确切的结果是 25。 有什么可以帮助我。 谢谢。

如何使用 C# 基于 Web 表单的优先级计算表达式

最好的方法是不要自己做:),有一个简单的方法使用DataTable进行表达式计算 在此链接下,您可以找到示例。

或者在这个例子中:

[TestMethod]
public void test()
{
    var evalTable = new DataTable();
    using (var evalExpressionColumn = new DataColumn("EvaluateExpression", typeof(double), "0"))
    {
        evalTable.Columns.Add(evalExpressionColumn);
    }
    evalTable.Rows.Add(0);
    evalTable.Columns[0].Expression = "(5 + 4 ) * 8";
    //Note: Evaluate expression.
    var res = Convert.ToDouble(evalTable.Rows[0]["EvaluateExpression"]);
    Assert.AreEqual(72, res);
}

还支持更复杂的计算,语法在我提供的链接中定义。