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