2015-02-22 1 views
0

Я пытался решить этот вопрос на SPOJ: http://www.spoj.com/problems/ONP/.Обратный Польский Обозначение Код Код

Я попытался реализовать два решения стека для проблемы, указанной выше. Он отлично работает в моей системе, но каждый раз, когда я пытаюсь отправить следующий код в SPOJ Engine, я получаю «Неверный ответ».

import java.io.*; 
import java.util.Stack; 
import java.util.Scanner; 


public class InfixToPostfix { 

    public static String postfixString(String expression) { 

     Stack <Character> valueStack = new Stack <Character>(); 
     Stack <Character> operatorStack = new Stack <Character>(); 

     char[] tokens = expression.toCharArray(); 

     for(char c : tokens) { 

      if(c == '('){ 
       continue; 
      } 

      else if(c == '+' || c == '-' || c == '*' || c == '/' || c == '^') { 
       operatorStack.push(c); 
       continue; 
      } 

      else if(c == ')') { 
       valueStack.push(operatorStack.peek()); 
       operatorStack.pop(); 
       continue; 
      } 

      else { 
       valueStack.push(c); 
       continue; 
      } 
     } 
     return valueStack.toString(); 
    } 
    public static void main (String [] args)throws java.lang.Exception { 

     String inputString = ""; 
     int n1; 
     Scanner numberOfTestCases = new Scanner(System.in); 
     try 
     { 
      n1 = numberOfTestCases.nextInt(); 
      StringBuilder[] sbuf = new StringBuilder[n1]; 
      Scanner inputExpression = new Scanner(System.in); 

      for(int i = 0; i < n1; i++) { 

       sbuf[i] = new StringBuilder(); 

       if(inputExpression.hasNextLine()) { 

        inputString = inputExpression.nextLine(); 

        sbuf[i].append(postfixString(inputString).replaceAll("\\[", "").replaceAll("]", "").replaceAll(", ", "")); 
       } 
       else { 
        break; 
       } 
      } 


      for(int i = 0; i < n1; i++) { 
       System.out.println(sbuf[i].toString()); 
      } 
     } 
     catch (Exception e) { 
      // System.out.println(""); 
      System.out.println(e.getMessage()); 
      // numberOfTestCases.next(); 
     } 
     System.exit(0); 
    } 

} 

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

P.S .: Проблема предполагает, что все входы будут заключены в скобки; нет необходимости включать код для разрешения приоритета оператора.

ответ

0
return valueStack.toString(); 

Это не возвращает нужный формат: он возвращает формат разделенной запятой, ограниченный [и], который является не то, что указано.

Но я уверен, что есть другие проблемы.

  • Я ничего не вижу в заявлении о проблеме, которое соответствует вашему PS: напротив, в нем конкретно упоминается приоритет оператора.

  • Вы уверены, что используете «все возможные тестовые примеры»? Попробуйте (1 + 2)/3 и 1 + 3/2.

  • Вы просматриваете то, что не нажали в случае ')'.

  • Я не понимаю, зачем вам нужны два стека.

Учитывая постановку проблемы, что вам нужно либо рекурсивный спуск анализатора выражений или алгоритм Дейкстров Шунтирования двора.