Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java调车场算法OutOfMemory错误_Java_String_Algorithm_Parsing_Char - Fatal编程技术网

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