Обратный обзор кода польской нотации
Я пытался решить этот вопрос на 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.
Ты заглядываешь что-то, чего не нажал в случае ')'.
Я тоже не понимаю, зачем тебе два стека.
Учитывая постановку задачи, вам нужен либо синтаксический анализатор выражений с рекурсивным спуском, либо алгоритм Дейкстры Шунтирования.