使用带有表达式树的c#.NET创建RPN计算器

问题描述 投票:1回答:1

我是表达式树的新手,现在已经有一段时间没有做C#了。我需要使用表达式树创建反向波兰表示法计算器。

到目前为止,我已经创建了2个堆栈,一个用于操作,另一个用于数字。我想知道如何拆分用户输入并在以下表达式中调用它]

Expression<Func<double, double, double, double>> calc = (x, y, z) => x + y - z;
 //sample input 11 6 5 4 + - / 7 * 2 2 2 + - 

    //my expression class
 class Expression : ExpressionVisitor
{
    Stack<int> nums = new Stack<int>();
    Stack<char> ops = new Stack<char>();



    public override Expression Visit(Expression node)
    {
        if (node == null)
        {
            return null;
        }
        switch (node.NodeType)
        {

            case ExpressionType.Add:
                return this.VisitBinary((BinaryExpression)node); 
            case ExpressionType.Subtract:
                return this.VisitBinary((BinaryExpression)node);
            case ExpressionType.Multiply:
                return this.VisitBinary((BinaryExpression)node);
            case ExpressionType.Divide:
                return this.VisitBinary((BinaryExpression)node);
            case ExpressionType.Power:
                return this.VisitBinary((BinaryExpression)node);
            default:
                return base.Visit(node);

        }
    }


    protected override Expression VisitBinary(BinaryExpression node)
    {

        var rightSide = this.Visit(node.rightSide);


        var leftSide = this.Visit(node.leftSide);
        switch (node.NodeType)
        {
            case ExpressionType.Add:
                return Expression.MakeBinary(ExpressionType.Add, leftSide, rightSide);
            case ExpressionType.Subtract:
                return Expression.MakeBinary(ExpressionType.Subtract, leftSide, rightSide);
            case ExpressionType.Multiply:
              return  Expression.MakeBinary(ExpressionType.Multiply, leftSide, rightSide);
            case ExpressionType.Divide:
              return  Expression.MakeBinary(ExpressionType.Divide, leftSide, rightSide);
            case ExpressionType.Power:
                return Expression.MakeBinary(ExpressionType.Power, leftSide, rightSide);

            default:
                return base.VisitBinary(node);
        }

//main class    
static void Main(string[] args)
    {


        var visitor = new Expression();
        string input = Console.ReadLine();
        string[] rpnTokens = input.Split(' ');
        Expression<Func<double, double, double, double>> calc = (x, y, z) => x + y - z;

        Console.WriteLine("result: " + calc);


    }

我是表达式树的新手,现在已经有一段时间没有做C#了。我需要使用表达式树创建反向波兰表示法计算器。到目前为止,我已经创建了2个堆栈,其中一个用于操作,并且...

c# algorithm .net-core tree
1个回答
0
投票

使用反向波兰表示法,将按照输入的顺序对用户输入进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.