2013-12-14 3 views
1

Я сделал преобразователь Infix в Postfix, и думал, что это сработало, но когда я вернулся и показал его моему учителю, один из примеров, которые он тестировал, оказался неправильным. : |C# Infix to Postfix convertor не дает правильного ответа, если несколько случаев

Буду признателен, если кто-то может помочь мне в этом вопросе, и дайте мне знать, что случилось.

Я пропустил часть о кнопках для ввода цифр и только выложил остальное,

private void button20_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string infix = textBox1.Text; 
      infixTopostfix obj = new infixTopostfix(infix); 
      textBox1.Text = string.Empty; 
      Console.WriteLine("{0} is the Postfix of {1}", obj.createPrifex(), infix); 

     } 
     catch (Exception e1) 
     { 
      Console.WriteLine(e1.ToString()); 
     } 
    } 

Часть выше для перенаправления console.writeline моего текстового поля и его кнопки, что делает все работу и дает окончательный результат.

Вот основной класс:

class infixTopostfix 
{ 
    public infixTopostfix(string strTemp) 
    { 
     strInput = strTemp; 
    } 

    private int isOperand(char chrTemp) 
    { 
     char[] op = new char[6] { '*', '/', '+', '-', '^', '(' }; 
     foreach (char chr in op) 
      if (chr == chrTemp) 
      { 
       return 1; 
      } 
     return 0; 
    } 
    private int isOperator(char chrTemp) 
    { 
     char[] op = new char[5] { '*', '/', '+', '-', '^' }; 
     foreach (char chr in op) 
      if (chr == chrTemp) 
      { 
       return 1; 
      } 
     return 0; 
    } 

    private string strResualt = null; 
    private string strInput = null; 
    public string createPrifex() 
    { 
     int intCheck = 0; 
     //int intStackCount = 0; 
     object objStck = null; 
     for (int intNextToken = 0; intNextToken <= strInput.Length - 1; intNextToken++) 
     { 
      intCheck = isOperand(strInput[intNextToken]); 
      if (intCheck == 1) 
       stkOperatore.Push(strInput[intNextToken]); 
      else 
       if (strInput[intNextToken] == ')') 
       { 
        int c = stkOperatore.Count; 
        for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++) 
        { 
         objStck = stkOperatore.Pop(); 
         intCheck = isOperator(char.Parse(objStck.ToString())); 
         if (intCheck == 1) 
         { 
          strResualt += objStck.ToString(); 
         } 
        } 
       } 
       else 
        strResualt += strInput[intNextToken]; 

     }//end of for(int intNextToken...) 
     int intCount = stkOperatore.Count; 
     if (intCount > 0) 
     { 
      int c = stkOperatore.Count; 
      for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++) 
      { 
       objStck = stkOperatore.Pop(); 
       intCheck = isOperator(char.Parse(objStck.ToString())); 
       if (intCheck == 1) 
       { 
        strResualt += Convert.ToString(objStck); 
       } 
      } 
     } 

     return strResualt; 
    } 

    private System.Collections.Stack stkOperatore = new System.Collections.Stack(); 

} 

}

Здесь вход, который терпит неудачу:

А^В^(CD/(E + F)) - (G + Н)^L * Z + Y

результат этого кода, который является неправильным:

ABCDEF +/- ^^ GH + -LZY + *^

Правильный результат:

ABCDEF +/- ^^ GH + L^Z * -Y +

+0

lol i Googled Shunting yard algorithm, похоже, что вы правы! судя по wikipedia, я пытаюсь преобразовать инфикс в постфикс с использованием этого алгоритма, во всяком случае, я думаю, что моя проблема лежит в приоритете операторов – Pedram

ответ

1

При преобразовании infix notation в постфиксную нотацию, AKA reverse polish notation, необходимо принимать во внимание operator precedence и operator associativity. Они обычно реализуются как таблица и просматриваются в таблице на основе символа оператора.

например.
Java
C#
C++

Как я не вижу никакого упоминания о приоритете или ассоциативности в коде; поэтому я бы сказал, что ваш код не имеет ошибки, но недействительный алгоритм.

Классический алгоритм преобразования infix в постфикс: shunting yard algorithmEdsger Dijkstra и, вероятно, является средством, наиболее близким к тому, что вы пытаетесь реализовать.

Я предлагаю вам работать с ручкой на бумаге, чтобы понять алгоритм шунтирования, а затем реализовать алгоритм, используя множество тестовых примеров, которые постепенно используют больше комбинаций операторов.

Лучшее объяснение, которое я знаю это Shunting Yard Algorithm

Если вы Google для C# маневрового дворе вы найдете множество реализаций, просто убедитесь, что если вы используете один правильно. Многие люди любят публиковать примеры этого, но часто ошибаются.Убедитесь, что они работают против многих тестовых случаев, прежде чем тратить время на них.

+0

Great, Tnx для примеров и объяснений ссылок: D я проверю их и попробую либо исправить или перестроить мой код, используя их: D – Pedram

+0

Извините, я здесь новый и не знаю, как все работает, и я думаю, что не могу упрекать u coz у меня нет 15 Репутация: | не уверен, как и получить репутацию. – Pedram

+0

хорошо, когда я нажимаю Upvote, скажу, что мне нужно По крайней мере 15 членов, чтобы сделать Upvote! но я могу принять его, Tnx: D – Pedram

 Смежные вопросы

  • Нет связанных вопросов^_^