Как использовать обратную польскую запись для решения дробно-рациональных уравнений - C#
Формулировка задачи:
Как использовать обратную польскую запись для решения дробно-рациональных уравнений?
строка ввода в textBox
Решение задачи: «Как использовать обратную польскую запись для решения дробно-рациональных уравнений»
textual
Листинг программы
public void PostfixNotationExpression(IEnumerable<string> funcNames) { operators = new List<string>(funcNames);//коллекция перечислителей operators.AddRange(standart_operators);//добавляем список операторов } private List<string> operators;//cписок объектов private List<string> standart_operators = new List<string>(new string[] { "(", ")", "+", "-", "*", "/", "^" }); public IEnumerable<string> Separate(string input) { input = Convert.ToString(textBox30.Text); // List<string> inputSeparated = new List<string>();//новая входная строка int pos = 0; while (pos < input.Length)// пока длина входной строки не будет равна 0 { string s = string.Empty + input[pos];// строка S=пустая строка+элемент с индексом [pos] входной строки if (!standart_operators.Contains(input[pos].ToString()))// если какой-то из операторов равен элементу с индексом [pos], то { if (Char.IsDigit(input[pos]))// for (int i = pos + 1; i < input.Length &&(Char.IsDigit(input[i]) || input[i] == ',' || input[i] == '.'); i++) s += input[i];// в строку S записываем элемент с индексом i, если он является цифрой else if (Char.IsLetter(input[pos]))//если символ с индексом [pos] буква, то for (int i = pos + 1; i < input.Length && (Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++) s += input[i];// в строку записываем символ с индексом [i] } yield return s;// возвращаем строку s pos += s.Length;// индекс pos теперь = длине строки S } } private byte GetPriority(string s)//проверка приоритетов { switch (s) { case "(": return 0; case ")": return 1; case "+": return 2; case "-": return 3; case "*": case "/": return 4; case "^": return 5; default: return 6; } } public string ConvertToPostfixNotation(string input) { List<string> outputSeparated = new List<string>();// формируем выходную строку Stack<string> stack = new Stack<string>();// подключаем стек foreach (string c in Separate(input)) { if (operators.Contains(c)) { if (stack.Count > 0 && !c.Equals("(")) { if (c.Equals(")")) { string s = stack.Pop(); while (s != "(") { outputSeparated.Add(s); s = stack.Pop(); } } else if (GetPriority(c) >= GetPriority(stack.Peek())) stack.Push(c); else { while (stack.Count > 0 && GetPriority(c) < GetPriority(stack.Peek())) outputSeparated.Add(stack.Pop()); stack.Push(c); } } else stack.Push(c); } else outputSeparated.Add(c); } if (stack.Count > 0) foreach (string c in stack) outputSeparated.Add(c); return string.Join("", outputSeparated.ToArray());
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д