簡體   English   中英

Java分流場算法內存不足錯誤

[英]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));
 }

}

為什么我收到此異常?

任何幫助,將不勝感激。

此代碼有兩個問題:

  1. 執行應該只進入的一個分支if α鏈,所以有一個else丟失:

     if (Character.isDigit(c)) { sb.append(" " + c); } else // insert else here if (c == '(') { stack.push('('); } else if ... 
  2. 該代碼不處理空格。 為此,添加一個額外的子句:

      ... 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM