public Operand[] GetExpression(Queue <string> rpnQueue) { var stack = new Stack <Operand>(); while (rpnQueue.Count > 0) { var s = rpnQueue.Dequeue(); if (decimal.TryParse(s, out var d)) { stack.Push(new Operand { Type = OperandType.Constant, Value = d }); } else if (operators.Contains(s)) { var op1 = stack.Pop(); var op2 = stack.Pop(); var opType = OperationType.FromValue <OperationType>(s); if (opType == OperationType.Substract) { op1.Value = -op1.Value; opType = OperationType.Add; } if (op1.Operation?.OperationType == opType) { op1.Operation.Operands.Add(op2); stack.Push(op1); } else if (op2.Operation?.OperationType == opType) { op2.Operation.Operands.Add(op1); stack.Push(op2); } else { var op = new Operand { Type = OperandType.Operation, Operation = new Operation { OperationType = opType, Operands = new List <Operand> { op2, op1 } }, Value = 1 }; stack.Push(op); } } else { stack.Push(new Operand { Type = OperandType.Variable, Name = s, Value = 1 }); } } return(stack.ToArray()); }