-3
Я работаю над построением дерева выражений из выражения инфикса. В настоящее время я конвертирую в постфикс, а затем строю дерево. Мой код работает для большинства выражений, но не для всех. Я делаю что-то не так с моей реализацией круглых скобок. Вот мой код:Алгоритм Shunting Yard в C# работает некоторое время
readonly static char[] operators = { '+', '-', '*', '/' };
string order_of_op(string op1, string op2)
{
if (op1 == "*" || op1 == "/")//is op1 higher?
{
return op1;//it is so return it
}
else if ((op2 == "*" || op2 == "/"))//is op2 higher
{
return op2;//it is so return it
}
else
return op1;// they are both addition or subtraction so return op1.
}
Queue<string> convert_to_postfix(string infix) //following the Shunting-yard algorithm
{
Queue<string> num_queue = new Queue<string>();
Stack<string> op_stack = new Stack<string>();
Stack<string> temp_stack = new Stack<string>();
string temp = "";
foreach (char s in infix)
{
if (operators.Contains(s) == true)//if its a function push it on the stack
{
if (temp != "")//make sure we don't push an empty string
num_queue.Enqueue(temp);
if (op_stack.Count != 0)//make sure we dont crash popping from empty stack
{
if (op_stack.Peek() != "(")//if we dont have a parenthese on top proceed as normal
{
if (op_stack.Count > 1)
{
while (op_stack.Count != 0 && order_of_op(op_stack.Peek(), s.ToString()) == op_stack.Peek())
{
num_queue.Enqueue(op_stack.Pop());
}
}
}
op_stack.Push(s.ToString());
}
else
{
op_stack.Push(s.ToString());
}
temp = "";
}
else if (s == '(')
{
op_stack.Push(s.ToString());
}
else if (s == ')')
{
if (temp!= "")
num_queue.Enqueue(temp);
temp = "";
while (op_stack.Peek() != "(")
{
num_queue.Enqueue(op_stack.Pop());
}
op_stack.Pop();
if (op_stack.Count > 1)
{
if (operators.Contains(op_stack.Peek()[0]) == true)
{
num_queue.Enqueue(op_stack.Pop());
}
}
}
else
{
temp += s;
}
}
if (temp != "")
{
num_queue.Enqueue(temp);
}
foreach (string s in op_stack)
{
num_queue.Enqueue(s);
}
Console.Write("Postfix = ");
foreach (string s in num_queue)
{
Console.Write(s);
}
Console.WriteLine();
return num_queue;
}
Благодарим за помощь!
Добро пожаловать в stackoverflow.com. Пожалуйста, найдите время [страницы справки] (http://stackoverflow.com/help), особенно разделы с именем [«Какие темы можно задать здесь?»] (Http://stackoverflow.com/help/ по-теме) и [«Какие типы вопросов я должен избегать?»] (http://stackoverflow.com/help/dont-ask). Также, пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). Вы также можете узнать, как создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – wimh
Что не работает? Пожалуйста, сделайте нашу работу как можно более простой. – Enigmativity
Было бы также здорово, если бы вы предоставили некоторые входные данные образца и как этот код предназначен для запуска. Также ваш код не компилируется. В нем отсутствует декларация для 'операторов'. Сейчас мы переходим к большой работе для нас. Пожалуйста, сделайте это проще. – Enigmativity