[英]Java Shunting Yard Algorithm OutOfMemory Error
我想從infix轉換為postfix表示法,因此我想使用Shunting Yard算法。 我將String令牌解析為令牌,並使用堆棧來存儲Operators。 但是當我運行程序時,出現以下異常:
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));
}
}
為什么我收到此異常?
任何幫助,將不勝感激。
此代碼有兩個問題:
執行應該只進入的一個分支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 }
這也是OperantValues(c)
“總是”返回-1
原因,因為代碼被卡在輸入字符串末尾的空格中。
應用上述修補程序可以解決問題。 輸出變為:
2 3+ 4 7+ 3**
如預期的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.