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()); }
//Checks function public static bool checkInputString(string formula) { int counter1 = 0, counter2 = 2; //Returns false if first symbol in function is operation (besides minus) if (SignChecker.isOperation(formula[0]) && formula[0] != '-') { return(false); } //Returs false if last symbol in string is operation if (SignChecker.isOperation(formula[formula.Length - 1])) { return(false); } //Counts ammount of opening and closing brackets counter1 = formula.ToCharArray().Where(x => x == '(').Count(); counter2 = formula.ToCharArray().Where(x => x == ')').Count(); //If ammount of brackets doesn't equal, then returns false if (counter1 != counter2) { return(false); } //Checks if there is no two operations side by side for (int i = 1; i < formula.Length; i++) { if (SignChecker.isOperation(formula[i]) && SignChecker.isOperation(formula[i - 1])) { return(false); } } return(true); }
public static bool checkInputString(string formula) { int counter1 = 0, counter2 = 2; if (SignChecker.isOperation(formula[0]) && formula[0] != '-') { return(false); } if (SignChecker.isOperation(formula[formula.Length - 1])) { return(false); } counter1 = formula.ToCharArray().Where(x => x == '(').Count(); counter2 = formula.ToCharArray().Where(x => x == ')').Count(); if (counter1 != counter2) { return(false); } for (int i = 1; i < formula.Length; i++) { if (SignChecker.isOperation(formula[i]) && SignChecker.isOperation(formula[i - 1])) { return(false); } } return(true); }
//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()); }
public static IEnumerable <string> findAllX(string rpnString) { Stack <Double> numbersStack = new Stack <Double>(); List <string> stringList = new List <string>(); string variable = ""; for (int i = 0; i < rpnString.Length; i++) { if (SignChecker.isVariable(rpnString[i])) { variable += rpnString[i]; } else { if (variable.Any(c => char.IsLetter(c))) { stringList.Add(variable); } variable = ""; } } return(stringList.Distinct()); }
//Finding all variables in rpnString public static List <string> findAllX(string rpnString) { Stack <Double> numbersStack = new Stack <Double>(); //Stack for numbers List <string> stringList = new List <string>(); //List of all variables string variable = ""; for (int i = 0; i < rpnString.Length; i++) { //If current symbol is variable if (SignChecker.isVariable(rpnString[i])) { //Add to current variable variable += rpnString[i]; } else { //If variable has symbols in itself if (variable.Any(c => char.IsLetter(c))) { //Add variable to variable list stringList.Add(variable); } variable = ""; } } if (variable != "") { //If variable has symbols in itself if (variable.Any(c => char.IsLetter(c))) { //Add variable to variable list stringList.Add(variable); } } //Return list of variables return(stringList.Distinct().ToList()); }
public static string toRPN(string infixString) { if (!CheckInput.checkInputString(infixString)) { return(""); } Stack <char> operationStack = new Stack <char>(); //Stack for all operations char lastOperation; string resultString = ""; //String with result infixString = infixString.Replace(" ", ""); for (int i = 0; i < infixString.Length; i++) { //If it is number, than add to resultString if (SignChecker.isVariable(infixString[i])) { resultString += infixString[i]; } else if (SignChecker.isOperation(infixString[i])) { if (infixString[i] == '-' && (((i == 0) || (infixString[i - 1] == '(')) && (SignChecker.isVariable(infixString[i + 1])))) { resultString += 0; } if (operationStack.Count != 0) { lastOperation = operationStack.Peek(); if (SignChecker.getOperationPriority(lastOperation) < SignChecker.getOperationPriority(infixString[i])) { operationStack.Push(infixString[i]); resultString += " "; } else { resultString += operationStack.Pop(); operationStack.Push(infixString[i]); resultString += " "; } } else { resultString += " "; operationStack.Push(infixString[i]); } } //If current symbol is (, then add it to stack else if (infixString[i] == '(') { operationStack.Push(infixString[i]); } //If current symbol is ), then return all symbols from stack, until ( else if (infixString[i] == ')') { while (operationStack.Peek() != '(') { resultString += operationStack.Pop(); } operationStack.Pop(); } } //In the end, return all the values from stack while (operationStack.Count != 0) { resultString += operationStack.Pop() + " "; } return(resultString); }
public static string toRPN(string infixString) { infixString = infixString.Replace(" ", ""); //Replacing all spaces if (!CheckInput.checkInputString(infixString)) //If we have wrong input string { throw new ArgumentException(); //Than throw exception } Stack <char> operationStack = new Stack <char>(); //Stack for all operations char lastOperation; //Keeping last operation string resultString = ""; //String with result for (int i = 0; i < infixString.Length; i++) { //If it is number, than add to resultString if (SignChecker.isVariable(infixString[i])) { resultString += infixString[i]; } //If it is operation else if (SignChecker.isOperation(infixString[i])) { //If it is unary minus< then add 0 to result string if (infixString[i] == '-' && (((i == 0) || (infixString[i - 1] == '(')) && (SignChecker.isVariable(infixString[i + 1])))) { resultString += 0; } //If we have operations in stack if (operationStack.Count != 0) { //Taking last operation of stack lastOperation = operationStack.Peek(); //If priority of operation from stack is higher, then pirority of current operation if (SignChecker.getOperationPriority(lastOperation) < SignChecker.getOperationPriority(infixString[i])) { //Add current operation to stack operationStack.Push(infixString[i]); resultString += " "; } else { //Add operation from stack to result string resultString += operationStack.Pop(); //Add current operation to stack operationStack.Push(infixString[i]); resultString += " "; } } else { //Add current operation to stack resultString += " "; operationStack.Push(infixString[i]); } } //If current symbol is (, then add it to stack else if (infixString[i] == '(') { operationStack.Push(infixString[i]); } //If current symbol is ), then return all symbols from stack, until ( else if (infixString[i] == ')') { while (operationStack.Peek() != '(') { resultString += operationStack.Pop(); } operationStack.Pop(); } } //In the end, return all the values from stack while (operationStack.Count != 0) { resultString += operationStack.Pop() + " "; } return(resultString); }