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

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


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

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

10   голосов , оценка 4.1 из 5
Похожие ответы