Обратный обзор кода польской нотации

Я пытался решить этот вопрос на SPOJ: http://www.spoj.com/problems/ONP/.

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

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);
    }

}

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

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

1 ответ

return valueStack.toString();

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

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

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

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

  • Ты заглядываешь что-то, чего не нажал в случае ')'.

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

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

Другие вопросы по тегам