请给出 计算表达式 (4+5.0)/ 4.2 * (3+5.3)
csharp
using System;
using System.Collections.Generic;
public class ExpressionEvaluator
{
public static double Evaluate(string expression)
{
var operands = new Stack<double>();
var operators = new Stack<char>();
for (int i = 0; i < expression.Length; i++)
{
char ch = expression[i];
if (ch == ' ')
continue;
if (ch == '(')
{
operators.Push(ch);
}
else if (char.IsDigit(ch) || ch == '.')
{
string operand = ch.ToString();
while (i + 1 < expression.Length && (char.IsDigit(expression[i + 1]) || expression[i + 1] == '.'))
{
operand += expression[i + 1];
i++;
}
operands.Push(double.Parse(operand));
}
else if (ch == ')')
{
while (operators.Peek() != '(')
{
ProcessOperator(operands, operators);
}
operators.Pop(); // Remove '('
}
else
{
while (operators.Count > 0 && Precedence(operators.Peek()) >= Precedence(ch))
{
ProcessOperator(operands, operators);
}
operators.Push(ch);
}
}
while (operators.Count > 0)
{
ProcessOperator(operands, operators);
}
return operands.Pop();
}
private static int Precedence(char op)
{
if (op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
private static void ProcessOperator(Stack<double> operands, Stack<char> operators)
{
char op = operators.Pop();
double operand2 = operands.Pop();
double operand1 = operands.Pop();
double result = ApplyOperator(op, operand1, operand2);
operands.Push(result);
}
private static double ApplyOperator(char op, double operand1, double operand2)
{
switch (op)
{
case '+':
return operand1 + operand2;
case '-':
return operand1 - operand2;
case '*':
return operand1 * operand2;
case '/':
if (operand2 == 0)
throw new DivideByZeroException("Division by zero");
return operand1 / operand2;
default:
throw new ArgumentException("Invalid operator");
}
}
public static void Main(string[] args)
{
string expression = "(4+5.0)/4.2*(3+5.3)";
double result = Evaluate(expression);
Console.WriteLine($"Result of expression {expression} is {result}");
}
}