使用实数对中缀进行后缀

时间:2013-03-20 17:41:10

标签: java

我正在尝试使用允许将中缀翻译为postfix express的应用程序。我只能用一个数字来做,但是当我为整个实数做这个时,它会显示错误!

public String doTrans() {
    for (int j = 0; j < input.length(); j++) {
        char ch = input.charAt(j);
        theStack.displayStack("For " + ch + " ");
        switch (ch) {
        case '+':
        case '-':
            gotOper(ch, 1);
            break;
        case '*':
        case '/':
            gotOper(ch, 2);
            break;
        case '(':
            theStack.push(ch);
            break;
        case ')':
            gotParen(ch);
            break;
        default:
            if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                    || input.charAt(j + 1) != '/'
                    || input.charAt(j + 1) != '('
                    || input.charAt(j + 1) != ')')
                number = number + ch;
            else
                output = output + number;
            break;
        }
    }
    while (!theStack.isEmpty()) {
        theStack.displayStack("While ");
        output = output + theStack.pop();
    }
    theStack.displayStack("End ");
    return output;
}

这就是错误!

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 14
    at java.lang.String.charAt(String.java:658)
    at InToPost.doTrans(InToPost.java:33)
    at InfixApp.main(InfixApp.java:15)

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'...

整个程序很长,我不能在这里发布!

最后编辑

default:
                if (j != input.length() - 1) {
                    if (input.charAt(j + 1) != '+'
                            || input.charAt(j + 1) != '-'
                            || input.charAt(j + 1) != '/'
                            || input.charAt(j + 1) != '('
                            || input.charAt(j + 1) != ')')
                        number = number + ch;
                    else
                        output = output + number;
                } else
                    output = output + number;
                break;

4 个答案:

答案 0 :(得分:1)

您的循环执行此操作:

for (int j = 0; j < input.length(); j++) {
    ...

以后再做

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'

要实现此功能,您的循环必须以input.length() - 1结束,否则您将在最后一次迭代中获得StringIndexOutOfBoundsException

答案 1 :(得分:0)

在这一行

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
你正在检查下一个角色。但是,如果你已经在最后呢?这就是你在String结束时的运行方式。在测试下一个字符之前,您需要分别检测此情况(字符串结尾)。

答案 2 :(得分:0)

        if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                || input.charAt(j + 1) != '/'
                || input.charAt(j + 1) != '('
                || input.charAt(j + 1) != ')')
            number = number + ch;
        else
            output = output + number;

一个简单的元素是||这里应该是&amp;&amp;因为!=。

可能一切都应该是:

number += ch;

答案 3 :(得分:0)

 if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                    || input.charAt(j + 1) != '/'
                    || input.charAt(j + 1) != '('
                    || input.charAt(j + 1) != ')')

以上代码查找下一个字符(如果它是操作符)。

你的for循环一直持续到input.length(),所以只需让循环去一个比这个位置小的END:

for(int j = 0; j&lt; input.length() - 1; j ++)//所以循环代码可以安全地引用最后一个字符。