【问题标题】:Java Shunting Yard Algorithm OutOfMemory ErrorJava 调车场算法 OutOfMemory 错误
【发布时间】: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


【解决方案1】:

这段代码有两个问题:

  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) "always" 返回-1 的原因,因为代码卡在输入字符串末尾的空格上。

应用上述修复即可解决问题。输出变为:

 2 3+ 4 7+ 3**

正如预期的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多