Java调车场算法OutOfMemory错误
我想将中缀符号转换为后缀符号,因此我想使用调车场算法。我解析字符串令牌作为令牌,并使用堆栈存储运算符。 但当我运行我的程序时,我得到了以下异常:Java调车场算法OutOfMemory错误,java,string,algorithm,parsing,char,Java,String,Algorithm,Parsing,Char,我想将中缀符号转换为后缀符号,因此我想使用调车场算法。我解析字符串令牌作为令牌,并使用堆栈存储运算符。 但当我运行我的程序时,我得到了以下异常: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unkno
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at ShuntingYardAlgorithm.toPostfix( ShuntingYardAlgorithm.java:46)
at ShuntingYardAlgorithm.main( ShuntingYardAlgorithm.java:59)
编辑:我的方法OperantValues似乎总是返回-1,但我不知道如何修复它
这是我的密码:
public class ShuntingYardAlgorithm {
static int OperantValues(char c) {
switch (c) {
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
}
return -1;
}
public static String toPostfix(String expr) {
Stack<Character> stack = new Stack<Character>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < expr.length(); i++) {
char c = expr.charAt(i);
if (Character.isDigit(c)) {
sb.append(" " + c);
}
if (c == '(') {
stack.push('(');
}
else if (c == ')') {
while (!stack.isEmpty() && stack.peek() != '(')
sb.append("" + stack.pop());
stack.pop();
} else {// Operator
while (!stack.isEmpty() && OperantValues(c) <=
OperantValues(stack.peek()))
sb.append(c);
stack.push(c);
}
}
while (!stack.isEmpty())
sb.append(stack.pop());
return sb.toString();
}
public static void main(String[] args) {
String expr = "(2+3)*((4+7)*3) ";
System.out.println(toPostfix(expr));
}
}
公共类调车算法{
静态整型操作值(字符c){
开关(c){
格“+”:
返回1;
案例'-':
返回1;
案例“*”:
返回2;
案例“/”:
返回2;
}
返回-1;
}
公共静态字符串toPostfix(字符串表达式){
堆栈=新堆栈();
StringBuilder sb=新的StringBuilder();
对于(int i=0;i 而(!stack.isEmpty()&&OperantValues(c)此代码存在两个问题:
执行只应输入if
-链的一个分支,因此缺少else
:
if (Character.isDigit(c)) {
sb.append(" " + c);
}
else // insert else here
if (c == '(') {
stack.push('(');
}
else if ...
代码不处理空格。为此,请添加一个额外的子句:
...
stack.pop();
} else
if (OperantValues(c) > -1) { // Operator
while (!stack.isEmpty() && OperantValues(c) <= OperantValues(stack.peek()))
sb.append(c);
stack.push(c);
}
else // other characters including space
{
continue; // we'll ignore them for now
}
正如预期的那样。您是否尝试过使用调试器单步执行代码并检查所有局部变量?是的,我的方法OperatantValues似乎总是返回-1,但我不明白为什么。说OperatantValues总是返回-1是不正确的。在进入无限循环之前,只处理了两个字符('和'2'都将返回-1。您确定这两个字符都将被指定为-1吗?
2 3+ 4 7+ 3**