有人能理解这个错误的原因吗?我想我把书堆和单子弄混了。我可以用什么代替"pop"?你的建议是什么?
Exception in thread "main" java.lang.IndexOutOfBoundsException:
at java.util.LinkedList.checkElementIndex(LinkedList.java:555)
at java.util.LinkedList.remove(
代码:
public class PostfixHesaplama {
public static void main(String[] args) {
String giris="231*+9-";
System.out.println("postfix evaluation: "+postfix(giris));
}
static int postfix(String giris)
{
//create a stack
List<Integer> list1=new LinkedList<>();
// Scan all characters one by one
for(int i=0;i<giris.length();i++)
{
char c=giris.charAt(i);
// If the scanned character is an operand (number here),
// push it to the stack.
if(Character.isDigit(c))
list1.add(c - '0');
// If the scanned character is an operator, pop two
// elements from stack apply the operator
else
{
int val1 = list1.remove(i);
int val2 = list1.remove(i);
switch(c)
{
case '+':
list1.add(val2+val1);
break;
case '-':
list1.add(val2- val1);
break;
case '/':
list1.add(val2/val1);
break;
case '*':
list1.add(val2*val1);
break;
}
}
}
return list1.pop();
}
如果您想推送和弹出,最好使用Stack。然而,我认为你的问题是remove(i)
。您可能想使用pop(或removeLast?(。
如果使用LinkedList,请使用addLast/removeLast或addFirst/removeFirst。
试试这个。添加LinkedList声明并使用removeLast((:
LinkedList<Integer> list1 = new LinkedList<>();
for (int i = 0; i < giris.length(); i++) {
char c = giris.charAt(i);
if (Character.isDigit(c)) {
list1.add(c - '0');
} else {
int val1 = list1.removeLast();
int val2 = list1.removeLast();
switch (c) {
case '+':
list1.add(val2 + val1);
break;
case '-':
list1.add(val2 - val1);
break;
case '/':
list1.add(val2 / val1);
break;
case '*':
list1.add(val2 * val1);
break;
}
}
}
return list1.removeLast();
您的问题来自第二次删除(i(。您试图从同一位置移除对象两次(注意:i没有递减。它具有相同的值(。您应该使用remove(i-1(进行第二次删除。当前代码段:
int val1 = list1.remove(i);
int val2 = list1.remove(i);
应该是:
int val1 = list1.remove(i);
int val2 = list1.remove(i-1);