将中缀转换为Postfix时扫描多位数字

时间:2015-03-02 19:50:11

标签: java string calculator infix-notation

我编写了以下方法将中缀表达式转换为后缀表达式。如果删除了注释代码,程序将返回给定单个数字整数的有效结果; 11 + 2将导致1 1 2 +而不是11 2 +,但1 + 2 - 3将返回1 2 + 3 - 。为了包括n位数字,我实现了一个if语句,如果相邻字符不是数字,它将空格连接到后缀字符串。但是,在执行期间会产生以下错误:

  

线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:3

代码:

public static String postfixConversion(String input) {

            int i;
            String postfix = "";

            Stack<Character> stack = new Stack<Character>();

            for (i = 0; i < input.length(); i++) {
                    while (input.charAt(i) == ' ') {
                            ++i;
                    }

                    if (Character.isDigit(input.charAt(i))) { 
                                    postfix += input.charAt(i);

                                    if (!Character.isDigit(input.charAt(i+1))) { //EXCEPTION OCCURS
                                           postfix += ' ';
                                    } 
                    }

                    else if (precedenceLevel(input.charAt(i)) != 0) {
                            while ((!stack.isEmpty()) && (precedenceLevel(stack.peek()) >= precedenceLevel(input.charAt(i))) && (stack.peek() != '(')) {
                                    postfix += stack.peek();
                                    postfix += ' ';
                                    stack.pop();
                            }

                            stack.push(input.charAt(i));
                    }

                    else if (input.charAt(i) == '(') {
                            stack.push(input.charAt(i));
                    }

                    else if (input.charAt(i) == ')') {
                            while (!stack.isEmpty() && stack.peek() != '(') {
                                    postfix += stack.peek();
                                    stack.pop();
                            }

                            stack.pop();
                    }
            }

            while (!stack.isEmpty()) {
                    postfix += stack.peek();
                    postfix += ' ';
            }

            return postfix;

    }

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

变化:

if (!Character.isDigit(input.charAt(i+1)))

要:

if (i+1 >= input.length() || !Character.isDigit(input.charAt(i+1)))

答案 1 :(得分:0)

很抱歉迟到的回复!问题在于以下几点:

while (!stack.isEmpty()) {
                postfix += stack.peek();
                postfix += ' ';
        }

这里使用方法peek(),它只是查看堆栈顶部的对象,而不删除它。因此,你陷入无限循环,你继续在postfix字符串中添加这个元素,并且因为这个元素永远不会从堆栈中删除,所以堆栈永远不会是空的,所以你在while循环中的条件被填充了因此,你永远不会跳出while循环。 尝试将peek()替换为pop(),如下所示:

while (!stack.isEmpty()) {
                postfix += stack.pop();
                postfix += ' ';
        }