Как использовать обратную польскую запись для решения дробно-рациональных уравнений - C#

Узнай цену своей работы

Формулировка задачи:

Как использовать обратную польскую запись для решения дробно-рациональных уравнений? строка ввода в textBox

Решение задачи: «Как использовать обратную польскую запись для решения дробно-рациональных уравнений»

textual
Листинг программы
  1. public void PostfixNotationExpression(IEnumerable<string> funcNames)
  2.         {
  3.             operators = new List<string>(funcNames);//коллекция перечислителей
  4.             operators.AddRange(standart_operators);//добавляем список операторов
  5.         }
  6.         private List<string> operators;//cписок объектов
  7.         private List<string> standart_operators = new List<string>(new string[] { "(", ")", "+", "-", "*", "/", "^" });
  8.  
  9.         public IEnumerable<string> Separate(string input)
  10.         {
  11.              input = Convert.ToString(textBox30.Text);
  12.            // List<string> inputSeparated = new List<string>();//новая входная строка
  13.             int pos = 0;
  14.             while (pos < input.Length)// пока длина входной строки не будет равна 0
  15.             {
  16.                 string s = string.Empty + input[pos];// строка S=пустая строка+элемент с индексом [pos] входной строки
  17.                 if (!standart_operators.Contains(input[pos].ToString()))// если какой-то из операторов равен элементу с индексом [pos], то
  18.                 {
  19.                     if (Char.IsDigit(input[pos]))//
  20.                         for (int i = pos + 1; i < input.Length &&(Char.IsDigit(input[i]) || input[i] == ',' || input[i] == '.'); i++)
  21.                             s += input[i];// в строку S записываем элемент с индексом i, если он является цифрой
  22.                     else if (Char.IsLetter(input[pos]))//если  символ с индексом [pos] буква, то
  23.                         for (int i = pos + 1; i < input.Length && (Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++)
  24.                             s += input[i];// в строку записываем символ с индексом [i]
  25.                 }
  26.                 yield return s;// возвращаем строку s
  27.                 pos += s.Length;// индекс pos теперь = длине строки S
  28.             }
  29.         }
  30.         private byte GetPriority(string s)//проверка приоритетов
  31.         {
  32.             switch (s)
  33.             {
  34.                 case "(":
  35.                     return 0;
  36.                 case ")":
  37.                     return 1;
  38.                 case "+":
  39.                     return 2;
  40.                 case "-":
  41.                     return 3;
  42.                 case "*":
  43.                 case "/":
  44.                     return 4;
  45.                 case "^":
  46.                     return 5;
  47.                 default:
  48.                     return 6;
  49.             }
  50.         }
  51.  
  52.         public string ConvertToPostfixNotation(string input)
  53.         {
  54.             List<string> outputSeparated = new List<string>();// формируем выходную строку
  55.             Stack<string> stack = new Stack<string>();// подключаем стек
  56.             foreach (string c in Separate(input))
  57.             {
  58.                 if (operators.Contains(c))
  59.                 {
  60.                     if (stack.Count > 0 && !c.Equals("("))
  61.                     {
  62.                         if (c.Equals(")"))
  63.                         {
  64.                             string s = stack.Pop();
  65.                             while (s != "(")
  66.                             {
  67.                                 outputSeparated.Add(s);
  68.                                 s = stack.Pop();
  69.                             }
  70.                         }
  71.                         else if (GetPriority(c) >= GetPriority(stack.Peek()))
  72.                             stack.Push(c);
  73.                         else
  74.                         {
  75.                             while (stack.Count > 0 && GetPriority(c) < GetPriority(stack.Peek()))
  76.                                 outputSeparated.Add(stack.Pop());
  77.                             stack.Push(c);
  78.                         }
  79.                     }
  80.                     else
  81.                         stack.Push(c);
  82.                 }
  83.                 else
  84.                     outputSeparated.Add(c);
  85.             }
  86.             if (stack.Count > 0)
  87.                 foreach (string c in stack)
  88.                     outputSeparated.Add(c);
  89.  
  90.             return string.Join("", outputSeparated.ToArray());

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы