Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedList弹出和推送_Java_Linked List - Fatal编程技术网

Java LinkedList弹出和推送

Java LinkedList弹出和推送,java,linked-list,Java,Linked List,有人能理解这个错误的原因吗?我想我把书堆和清单弄混了。我可以用什么来代替“pop”?你有什么建议 线程“main”java.lang.IndexOutOfBoundsException中的异常: 位于java.util.LinkedList.checkElementIndex(LinkedList.java:555) 在java.util.LinkedList.remove( 代码: public class PostfixHesaplama { public static void

有人能理解这个错误的原因吗?我想我把书堆和清单弄混了。我可以用什么来代替“pop”?你有什么建议

线程“main”java.lang.IndexOutOfBoundsException中的异常: 位于java.util.LinkedList.checkElementIndex(LinkedList.java:555) 在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();
} 
公共类postfixesaplama{
公共静态void main(字符串[]args){
字符串giris=“231*+9-”;
System.out.println(“后缀评估:+postfix(giris));
}
静态int后缀(字符串giris)
{ 
//创建一个堆栈
List list1=新链接列表();
//逐个扫描所有字符

对于(int i=0;i如果您想推送和弹出,a会更好地为您服务。但是,我认为您的问题是
remove(i)
。您可能想使用pop(或removeLast?)


如果您继续使用LinkedList,请使用addLast/removeLast或addFirst/removeFirst。

您的问题来自第二次删除(i)。您尝试从同一位置删除对象两次(注意:i没有递减。其值相同)。第二次删除时应使用删除(i-1)。 当前代码段:

 int val1 = list1.remove(i); 
 int val2 = list1.remove(i); 
应该是:

 int val1 = list1.remove(i); 
 int val2 = list1.remove(i-1); 

尝试此操作。添加LinkedList声明并使用removeLast():

LinkedList list1=新建LinkedList();
对于(int i=0;i
也许ArrayDeque会更好。文档似乎表明它的性能优于堆栈和队列。用于堆栈的文档甚至建议在堆栈上使用Deque
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();