我编写了以下方法将中缀表达式转换为后缀表达式。如果删除了注释代码,程序将返回给定单个数字整数的有效结果; 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;
}
任何帮助将不胜感激:)
答案 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 += ' ';
}