public static Double CalculateRPN(string rpnString, double[] values) { Stack <Double> numbersStack = new Stack <Double>(); Double value1, value2; int pos = 0; string variable = ""; for (int i = 0; i < rpnString.Length; i++) { if (SignChecker.isVariable(rpnString[i])) { variable += rpnString[i]; } else if (rpnString[i] == ' ') { if (variable != "") { numbersStack.Push(int.Parse(variable)); } variable = ""; } else { if (variable != "") { numbersStack.Push(int.Parse(variable)); variable = ""; } value2 = numbersStack.Pop(); value1 = numbersStack.Pop(); numbersStack.Push(SignChecker.useOperator(rpnString[i], value1, value2)); } } return(numbersStack.Pop()); }
//Calculating function public static Double CalculateRPN(string rpnString, List <string> variables, double[] values) { Stack <Double> numbersStack = new Stack <Double>(); //stack for numbers Double value1, value2; //first and second values string variable = ""; //Current variable //Replaces all variables from rpn string to variables values for (int i = 0; i < variables.Count; i++) { rpnString = rpnString.Replace(variables[i], values[i].ToString()); } for (int i = 0; i < rpnString.Length; i++) { //If current symbol is variable if (SignChecker.isVariable(rpnString[i])) { //Add to variable variable += rpnString[i]; } else if (rpnString[i] == ' ') { //If current symbol is space and we have something in variable if (variable != "") { //Add variable to stack numbersStack.Push(double.Parse(variable)); } variable = ""; } else if (rpnString[i] == '-' && i != rpnString.Length - 1 && SignChecker.isVariable(rpnString[i + 1])) { variable += rpnString[i]; } else { //If variable has something if (variable != "") { //Add to stack numbersStack.Push(double.Parse(variable)); variable = ""; } //Take two values from stack value2 = numbersStack.Pop(); value1 = numbersStack.Pop(); //Calculate them numbersStack.Push(SignChecker.useOperator(rpnString[i], value1, value2)); } } if (variable != "") { numbersStack.Push(double.Parse(variable)); } return(numbersStack.Pop()); }