我一直试图在SPOJ上解决这个问题:http://www.spoj.com/problems/ONP/。
我试图针对上述问题实施两个Stack解决方案。它在我的系统上工作正常,但每次我尝试将以下代码提交给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);
}
}
我无法弄清楚我哪里出错了;我已经尝试过所有可能的测试用例。
P.S。:该问题假设所有输入都是括号;不需要包含任何用于解析运算符优先级的代码。
答案 0 :(得分:0)
return valueStack.toString();
这不会返回所需的格式:它返回以[和]为界的逗号分隔格式,而不是指定的格式。
但我确定还有其他问题。
我没有在与你的PS相对应的问题陈述中看到任何内容:相反,它特别提到了运营商的优先权。
您确定已经“尝试过所有可能的测试用例”吗?尝试(1 + 2)/ 3和1 + 3/2。
在')'的情况下,你偷看了一些你没有推过的东西。
我不明白为什么你需要两个堆栈。
鉴于问题陈述,您需要的是递归下降表达式解析器或Dijkstra Shunting-yard算法。