【发布时间】:2018-09-29 06:27:20
【问题描述】:
我想从中缀转换为后缀表示法,因此我想使用调车场算法。我将字符串令牌解析为令牌并使用堆栈来存储运算符。 但是当我运行我的程序时,我得到了以下异常:
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));
}
}
为什么我得到这个异常?
任何帮助将不胜感激。
【问题讨论】:
-
您是否尝试过使用调试器单步执行代码并检查所有局部变量?
-
是的,我的 Method OperatantValues 似乎总是返回 -1,但我不明白为什么。
-
说 OperatantValues 总是返回 -1 是不正确的。在进入无限循环之前处理的唯一两个字符是 '(' 和 '2' 两者都将返回 -1。你确定这两个字符都应该被分配 -1 吗?
标签: java string algorithm parsing char