有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用pop()和push()的java堆栈数组

我为使用堆栈的程序创建的两个类有问题。我遇到的第一个问题是,当我试图运行该程序时,会出现运行时错误

这是一件很难问的事情,因为它做了好几件事。它要求用户输入向堆栈中添加数字,并检查堆栈是满的还是空的。我可能还需要帮助来复制阵列

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at IntegerStack.push(IntegerStack.java:24) at Lab15.main(Lab15.java:38)

这是运行该程序的主类

import java.util.Scanner;


public class Lab15 {

    public static void main(String[] args)
    {
        System.out.println("***** Playing with an Integer Stack *****");
        final int SIZE = 5;
        IntegerStack myStack = new IntegerStack(SIZE);
        Scanner scan = new Scanner(System.in);

        //Pushing integers onto the stack
        System.out.println("Please enter an integer to push onto the stack - OR - 'q' to Quit");
        while(scan.hasNextInt())
        {
            int i = scan.nextInt();
            myStack.push(i);
            System.out.println("Pushed "+ i);
        }

        //Pop a couple of entries from the stack
        System.out.println("Lets pop 2 elements from the stack");
        int count = 0;
        while(!myStack.isEmpty() && count<2)
        {
            System.out.println("Popped "+myStack.pop());
            count++;
        }

        scan.next(); //Clearing the Scanner to get it ready for  further input.

        //Push a few more integers onto the stack
        System.out.println("Push in a few more elements - OR - enter q to quit");
        while(scan.hasNextInt())
        {
            int i = scan.nextInt();
            myStack.push(i);
            System.out.println("Pushed "+ i);
        }

        System.out.println("\nThe final contentes of the stack are:");
        while(!myStack.isEmpty())
        {
            System.out.println("Popped "+myStack.pop());
        }

    }

}

这是一个将数字添加到堆栈中的类,这就是问题所在。这是我可能需要帮助复制阵列的地方。最后

import java.util.Arrays;

public class IntegerStack 
{
    private int stack [];
    private int top; 

    public IntegerStack(int SIZE) 
    {
        stack = new int [SIZE];
        top = -1;
    }

    public void push(int i) 
    {
        if (top == stack.length)
        {
            extendStack();
        }

        stack[top]= i;
        top++;
    }

    public int pop() 
    {
        top --;
        return stack[top];
    }

    public int peek()
    {
        return stack[top];
    }

    public boolean isEmpty() 
    {
        if ( top == -1);
        {
            return true;
        }
    }

    private void extendStack()
    {
        int [] copy = Arrays.copyOf(stack, stack.length);
    }
}

任何帮助或指导都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    为堆栈实现提供更好的解决方案

    import java.util.List;
    import java.util.ArrayList;
    public class IntegerStack 
    
    {
    
        private List<Integer> stack;
    
        public IntegerStack(int SIZE) 
        {
            stack = new ArrayList<Integer>(SIZE);
        }
    
        public void push(int i) 
        {
    
           stack.add(0,i);
         }
    
         public int pop() 
         { 
            if(!stack.isEmpty()){
               int i= stack.get(0);
               stack.remove(0);
               return i;
            } else{
               return -1;// Or any invalid value
            }
         }
    
         public int peek()
         {
            if(!stack.isEmpty()){
               return stack.get(0);
            } else{
               return -1;// Or any invalid value
            }
         }
    
    
         public boolean isEmpty() 
         {
           stack.isEmpty();
         }
    
     }
    

    如果必须使用数组。。。下面是代码中的问题和可能的解决方案

    import java.util.Arrays;
    public class IntegerStack 
    {
    
        private int stack [];
        private int top; 
    
        public IntegerStack(int SIZE) 
       {
        stack = new int [SIZE];
        top = -1; // top should be 0. If you keep it as -1, problems will arise when SIZE is passed as 0. 
        // In your push method -1==0 will be false and your code will try to add the invalid element to Stack .. 
         /**Solution top=0; */
        }
    
    public void push(int i) 
    {
        if (top == stack.length)
        {
            extendStack();
        }
    
           stack[top]= i;
            top++;
    
    }
    
    public int pop() 
    {
        top --; // here you are reducing the top before giving the Object back 
       /*Solution 
          if(!isEmpty()){
          int value = stack[top];
           top --;
         return value; 
        } else{
          return -1;// OR invalid value
        }
       */
        return stack[top];
    }
    
    public int peek()
    {
        return stack[top]; // Problem when stack is empty or size is 0
        /*Solution 
           if(!isEmpty()){
             return stack[top];
           }else{
             return -1;// Or any invalid value
           }
        */
    
    
    }
    
    
    public boolean isEmpty() 
    {
        if ( top == -1); // problem... we changed top to 0 above so here it need to check if its 0 and there should be no semicolon after the if statement
       /* Solution if(top==0) */
        {
            return true;
        }
    }
    
    private void extendStack()
    {
    
        int [] copy = Arrays.copyOf(stack, stack.length); // The second parameter in Arrays.copyOf has no changes, so there will be no change in array length.
      /*Solution  
        stack=Arrays.copyOf(stack, stack.length+1); 
       */
         }
    
         }
    
  2. # 2 楼答案

    Java中的堆栈实现

      class stack
      {  private int top;
         private int[] element;
          stack()
          {element=new int[10];
          top=-1;
          }
          void push(int item)
          {top++;
          if(top==9)
              System.out.println("Overflow");
          else
                  {
                   top++;
          element[top]=item;
    
          }
    
          void pop()
          {if(top==-1)
              System.out.println("Underflow");
          else  
          top--;
          }
          void display()
          {
              System.out.println("\nTop="+top+"\nElement="+element[top]);
          }
    
          public static void main(String args[])
          {
            stack s1=new stack();
            s1.push(10);
            s1.display();
            s1.push(20);
            s1.display();
            s1.push(30);
            s1.display();
            s1.pop();
            s1.display();
          }
    
      }
    

    输出

    
    Top=0
    Element=10
    
    Top=1
    Element=20
    
    Top=2
    Element=30
    
    Top=1
    Element=20
    
  3. # 3 楼答案

    因为在构造函数中将top变量初始化为-1,所以在访问数组之前,需要在push()方法中增加top变量。请注意,我已将赋值更改为使用^{

    public void push(int i) 
    {
        if (top == stack.length)
        {
            extendStack();
        }
    
        stack[++top]= i;
    }
    

    这将修复你发布的ArrayIndexOutOfBoundsException。我可以在你的代码中看到其他问题,但由于这是一个家庭作业,我将把它们作为“读者练习”。:)