我正在尝试制作RPN计算器。我已完成从中缀到后缀的转换,现在我想评估转换后的表达式。当我输入任何表达式时,我会收到错误
字符串索引超出范围:1。
这是我的代码与我应该在该计划中做的事情:
static int eval(String postfix) {
int result = 0;
String temp2 = "";
int num1, num2, OPS;
char operator;
String delete = "";
for (int i = 0; i < postfix.length(); i++) {
char M = postfix.charAt(i);
// if v_i is an operand: Push v_i to tmp2.
if (Character.isDigit(postfix.charAt(i))) {
temp2 = M + temp2;
}
/*
* if v_i is an operator: Apply v_i to the top two elements of tmp2.
* Replace these by the result in tmp2.
*/
if (postfix.charAt(i) == '+' || postfix.charAt(i) == '-' || postfix.charAt(i) == '*'
|| postfix.charAt(i) == '/') {
temp2 = M + temp2.substring(2);
}
while (postfix.charAt(0) != '0') {
num1 = Character.getNumericValue(temp2.charAt(temp2.length()-1));
delete = delete.substring(0,i);
operator = postfix.charAt(i);
num2 = Character.getNumericValue(temp2.charAt(temp2.length()+i));
//Integer.parseInt(postfix.substring(0,i));
result = num1 + num2;
result = num1 - num2;
result = num1 * num2;
result = num1 / num2;
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
}
if (temp2.length() != 0) {
temp2 = result + temp2;
}
}
return result;
}
我在这部分得到错误:
while (postfix.charAt(0) != '0') {
num1 = Character.getNumericValue(temp2.charAt(temp2.length()-1));
delete = delete.substring(0,i);
operator = postfix.charAt(i);
num2 = Character.getNumericValue(temp2.charAt(temp2.length()+i));
//Integer.parseInt(postfix.substring(0,i));
正如您所看到的,我尝试了一些不同的字符串操作,但它们都不正确。 我的主管说了一些关于从后面读取字符串或最后一串字符串的东西,但我从未明白它们的意思。感谢您提前提供任何帮助
答案 0 :(得分:1)
temp2.charAt(temp2.length()+i)
您正在使用charAt
访问字符串的字符。但是temp2
包含temp2.length()
个字符。因此,您可以从索引0到temp2.length() - 1
访问它们。因此,访问位置temp2.length()+i
处的角色超出范围...(对于i > 0
!!)
看看你之前的temp2.charAt(temp2.length()-1)
。
在这里,您访问了字符串的最后一个字符(在索引temp2.length()-1
处)。具有更大索引的任何访问都将导致索引超出范围。
编辑:你的while循环的停止条件是while (postfix.charAt(0) != '0')
。在循环中,您永远不会更改postfix
字符串。因此,如果满足条件(postfix
的第一个字符不是'0'),您将拥有无限循环。因此,你永远不会到达退货声明。
答案 1 :(得分:0)
更改此行 Character.getNumericValue(temp2.charAt(temp2.length()+ I)); 至 Character.getNumericValue(temp2.charAt(temp2.length()+ I-1));