Stack array using pop() and push()

171,099

Solution 1

Better solution for your Stack implementation

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();
     }

 }

If you have to use Array... Here are problems in your code and possible solutions

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); 
   */
     }

     }

Solution 2

Because you initialized the top variable to -1 in your constructor, you need to increment the top variable in your push() method before you access the array. Note that I've changed the assignment to use ++top:

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

    stack[++top]= i;
}

That will fix the ArrayIndexOutOfBoundsException you posted about. I can see other issues in your code, but since this is a homework assignment I'll leave those as "an exercise for the reader." :)

Solution 3

 public class Stack {
     int[] arr;
     int MAX_SIZE;
     int top;

public Stack(int n){
    MAX_SIZE = n;
    arr = new int[MAX_SIZE];
    top=0;
}

    public boolean isEmpty(){
        if(top ==0)
            return true;
      else
        return false;
   }

public boolean push(int ele){

    if(top<MAX_SIZE){
        arr[top] = ele;
        top++;
        return true;
    }
    else{
        System.out.println("Stack is full");
        return false;
    }
}
public void show(){
    for(int element:arr){
        System.out.print(element+" ");
    }
}
public int size(){
    return top;
}
   public int peek(){
        if(!isEmpty()){
            int peekTest = arr[top-1];
            return peekTest;
                    }
   else{
       System.out.println("Stack is empty");
       return 0;
   } 
}
public int pop(){
    if(isEmpty()){
        System.out.println("Stack is Emmpty");
        return 0;
    }
    else{
        int element = arr[--top];
        return element;
    }
}

}

Share:
171,099
user2321685
Author by

user2321685

Updated on December 23, 2020

Comments

  • user2321685
    user2321685 over 3 years

    I have a problem with 2 classes that I have created for a program the uses the stack. The first problem that I get is that when I try to run the program I get a run time error.

    Its kind of a difficult thing to ask because it doing several things. It asks for user input to add numbers to the stack and checking if the stack is full or empty. I also may need help to copy the array.

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

    This is the main class that runs the program.

    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());
            }
    
        }
    
    }
    

    This is the class that is adding the numbers to the stack which is what has the problems. This is where I may need help copying the array. At the end.

    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);
        }
    }
    

    Any help or direction will be appreciated.

  • user2321685
    user2321685 about 11 years
    This worked but Im still having another problem. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at IntegerStack.push(IntegerStack.java:27) at Lab15.main(Lab15.java:18) It comes up when the user input exceeds the size of the array which in this case is 5. That is why in my code i call a method that its supposed to copy the array and increase the size.public void push(int i) { if (top == stack.length) extendStack(); stack[++top]= i; } it calls private void extendStack() { stack = Arrays.copyOf(stack, 2 * stack.length); }
  • Shubham Batham
    Shubham Batham almost 4 years
    Kindly add comments to make the code more understandable
  • Manash Ranjan Dakua
    Manash Ranjan Dakua almost 4 years
    Hi Shubham.. Here i created stack using array so for that i Max_Size which is an size of array variable which is defined in creation of stack and after that all operation for logic i wrote like push(), pop(),show(), etc..... Please, go through once you will understand