2016-11-26 12 views
0

Извините, что уменьшилось качество архивов StackOverflow; но поверьте мне, для вашего же блага, НЕ ВЫПОЛНЯЙТЕ INFIX - ПОСТФИКС ИСПОЛЬЗОВАТЬ ТОКНИЗАТОР и CharAt (0).Infix -> Postfix Parantheses не обрабатывается правильно Java

Просто нет.

Regex. Трещина. BufferedReader. Сканер. Что-нибудь. Я узнал о Regex и полностью отказался от этих усилий.

+0

Комментарий «ничего не делает» неверен. – EJP

+0

Взгляните на мои комментарии к Сагару У. Если бы на время было необходимое изменение. Все еще не уверен, почему я не могу рассчитать правильный ответ ... моя программа может обрабатывать подобные постышки, но в любой момент, когда есть круглые скобки, связанные с получением там, он не вычисляет правильный результат (все еще работает над этим сам в данный момент , немного тупик, хотя). –

+0

Вот такая мысль: как вы будете реализовывать свой собственный простой механизм regex в java, если вы не хотите конвертировать из infix в postfix? Не использование встроенных библиотек является частью процесса обучения. Разумеется, вам не будет предложено внедрить регулярное выражение в движке в вашей работе, но такие назначения улучшат ваши навыки решения проблем и сделают вас лучшим программистом. Как вы думаете, компилятор оценивает выражения? ;) – rafid059

ответ

0

Исправленная часть кода -

static int precedenceOrder(char op) { 
    switch (op) { 
    case '(': 
     return -1; 
    case '+': 
    case '-': 
     return 1; 
    case '*': 
    case '/': 
    case '%': 
     return 2; 
    default: 
     return 0; 

    } 
} 

public static boolean isSpace(char c) { 
    return (c == ' '); 
} 

public static boolean decidePrecedence(char a, char b) { 
    return (precedenceOrder(a) >= precedenceOrder(b)); 
} 

public static String infixToPostfix(String infix) { 
    StringTokenizer t = new StringTokenizer(infix); 
    String postfix = ""; 
    Stack opStack = new Stack(); 

    while (t.hasMoreTokens()) { 
     String token = t.nextToken(); 
     char c = token.charAt(0); 

     if (c == '(') { 
      opStack.push(c); 
     } else if (Character.isDigit(c)) { 
      postfix += (c + " "); 
     } else if (c == ')') { 
      while (!opStack.isEmpty() && ! opStack.peek().equals('(')) { // Not added to the second expression 
       postfix += (opStack.pop() + " "); 
      } 
      if (!opStack.isEmpty()) { // changed from while to if. 
       opStack.pop(); // DOES NOTHING? removes '(' 
      } 
     } 
     else { 
      char topElement; 
      while (!opStack.empty() && (decidePrecedence((Character) opStack.peek(), c))) { 
       topElement = (Character) opStack.pop(); 
       if (topElement != '(') { 
        postfix += (topElement + " "); 
       } 
      } 

      opStack.push(new Character(c)); 

     } 
    } 

    while (!opStack.empty()) { 
     char top = (Character) opStack.pop(); 
     if (top != '(') 
      postfix += (top + " "); 
    } 
    return postfix; 
} 

public static boolean isOperator(char c) { 

    return c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '(' || c == ')' || c == '%'; 
} 

public static double evalPostfix(String postfix) { 

    // commented this line. 
    // postfix = postfix.replace(" ", ""); 

    StringTokenizer t = new StringTokenizer(postfix); 
    Stack opStack = new Stack(); 
    String token; 
    double op1, op2, result = 0; 

    while (t.hasMoreTokens()) { 
     token = t.nextToken(); 
     char c = token.charAt(0); 
     if (isOperator(c)) { 
      op2 = (Double) opStack.pop(); 
      op1 = (Double) opStack.pop(); 

      result = evalSingle(c, op1, op2); 
      opStack.push(new Double(result)); 
     } else { 
      double pushValue = Double.valueOf(String.valueOf(c)); 
      opStack.push(pushValue); 
     } 
    } 

    result = (Double) opStack.pop(); 

    if (!opStack.isEmpty()) { 
     throw new IllegalArgumentException("invalid postfix"); 
    } 
    return result; 
} 

Почему -1? Позвольте мне ответить, предположим (a + b), то каков статус стека, когда столбец «+» встречается в стеке »(« когда вы добавляете + в стек, который вы пытаетесь выталкивать всех других операторов из стека, которые выше по приоритету чем +, то в этом вы также можете поп '(', потому что вы дали 3, который выше в приоритете. Либо вы должны остановиться на '(' при выборе приоритета или make '(' low ie -1, так что это автоматически меньше или равна той, что вы вносите. вы можете исправить его в обоих направлениях.

следует также избегать Шара (0). вы можете обрезать и получить удвоенное значение

String token = " 9"; 
Double value = Double.valueOf(token.trim()); 

накладку () удаляет передние и конечные пробелы и Double.valueOf преобразует String в Double, короче говоря, вы можете прочитать его как «двойное значение String».

+0

Я понимаю, что время, если изменилось, но почему у вас есть он -1? Это действительно что-то делает? В каждом примере фрагмента кода, который я мог найти, у них были скобки, возвращающие значение приоритета приоритета из любого оператора. –

+0

Выполнены оба изменения - postfix работает отлично! Объяснения были бы очень признательны. Кроме того, мое расчетное значение неверно. Есть идеи? Спасибо огромное! –

+0

Я начинаю думать, что исправление постфикса в evalPostFix - ошибка? Если я обрезаю, ответ неверен. Если я не обрезаю, ответ будет еще более неправильным - даже отрицательным! –