0

我正在尝试将此 .txt 文件读入我的程序(作为对手动输入的改进),但我无法将我的方法转换为接受输入 txt 文件。我在“infix[--pos]='\0';”行得到了一个 arrayindexoutofboundsexception

class Functions {
    void postfix(char infix[], char post[]) {
        int position, und = 1;
        int outposition = 0;
        char topsymb = '+';
        char symb;
        Stack opstk = new Stack();
        opstk.top = -1;
        for (position = 0; (symb = infix[position]) != '\0'; position++) {
            if (isoperand(symb))
                post[outposition++] = symb;
            else {
                if (opstk.isempty() == 1)
                    und = 1;
                else {
                    und = 0;
                    topsymb = opstk.pop();
                }
                while (und == 0 && precedence(topsymb, symb) == 1) {
                    post[outposition++] = topsymb;
                    if (opstk.isempty() == 1)
                        und = 1;
                    else {
                        und = 0;
                        topsymb = opstk.pop();
                    }
                }// end while
                if (und == 0)
                    opstk.push(topsymb);
                if (und == 1 || (symb != ')'))
                    opstk.push(symb);
                else
                    topsymb = opstk.pop();
            }// end else
        }// end for
        while (opstk.isempty() == 0)
            post[outposition++] = opstk.pop();
        post[outposition] = '\0';
    }// end postfix function

    int precedence(char topsymb, char symb) {
        /* check precedence and return 0 or 1 */
        if (topsymb == '(')
            return 0;
        if (symb == '(')
            return 0;
        if (symb == ')')
            return 1;
        if (topsymb == '$' && symb == '$')
            return 0;
        if (topsymb == '$' && symb != '$')
            return 1;
        if (topsymb != '$' && symb == '$')
            return 0;
        if ((topsymb == '*' || topsymb == '/') && (symb != '$'))
            return 1;
        if ((topsymb == '+' || topsymb == '-') && (symb == '-' || symb == '+'))
            return 1;
        if ((topsymb == '+' || topsymb == '-') && (symb == '*' || symb == '/'))
            return 0;
        return 1;
    } /* end precedence function */

    private boolean isoperand(char symb) {
        /* Return 1 if symbol is digit and 0 otherwise */
        if (symb >= '0' && symb <= '9')
            return true;
        else
            return false;
    }/* end isoperand function */

}

public class Driver {
    public static void main(String[] args) throws IOException {
        Functions f = new Functions();
        char infix[] = new char[80];
        char post[] = new char[80];
        int pos = 0;
        char c;
        System.out.println("\nEnter an expression is infix form : ");

        try {
            BufferedReader in = new BufferedReader(new FileReader("infix.txt"));
            String str;
            while ((str = in.readLine()) != null) {
                infix = str.toCharArray();
            }
            in.close();
        } catch (IOException e) {
        }

        infix[--pos] = '\0';
        System.out.println("The original infix expression is : ");
        for (int i = 0; i < pos; i++)
            System.out.print(infix[i]);
        f.postfix(infix, post);
        System.out.println("\nThe postfix expression is : ");
        for (int i = 0; post[i] != '\0'; i++)
            System.out.println(post[i]);

    }
}
4

2 回答 2

0

永远不应该这样做:

try {
...
} catch (IOException e) {
}

您丢失了有关代码运行的一些基本信息。

至少您应该打印堆栈跟踪以跟踪调查:

e.printStackTrace();

您可能有 FileNotFound 异常。

此外,您尝试将数组索引为 -1 in infix[--pos],在此语句之前将 pos 设置为 0。

于 2012-09-27T16:50:38.010 回答
0

1) 完全放在一边,但我认为 main 中的行应该是:System.out.println("\nEnter an expression in infix form : "); 2) 同样,我同意 catch 声明。您已经将其缩小为 IOExcpetion,但是您可以通过在 catch System.err.println(e.getMessage()); 中打印以下内容来找到更多信息。或 e.printStackTrace()

现在回答你的问题。您正在将 pos 初始化为值 0,但是您正在 infix[--pos] = '\0'; 行上执行 PREINCREMENT 所以 pos 变为 -1(显然超出了数组边界的范围)。

我认为您想将其更改为后增量中缀 [pos--] = '\0';。也许?

是的,你的代码看起来像 C ......

于 2012-09-27T17:24:14.017 回答