2016-02-22 1 views
-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; 
     } 

Благодарим за помощь!

+1

Добро пожаловать в 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

+0

Что не работает? Пожалуйста, сделайте нашу работу как можно более простой. – Enigmativity

+0

Было бы также здорово, если бы вы предоставили некоторые входные данные образца и как этот код предназначен для запуска. Также ваш код не компилируется. В нем отсутствует декларация для 'операторов'. Сейчас мы переходим к большой работе для нас. Пожалуйста, сделайте это проще. – Enigmativity

ответ

0

Ну, я исправил его! Все, что я должен был изменить was-

if (op_stack.Count > 1) 

к

if (op_stack.Count >= 1) 
Смежные вопросы