Как использовать обратную польскую запись для решения дробно-рациональных уравнений - 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());
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д