Stack array using pop() and push()
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;
}
}
}
user2321685
Updated on December 23, 2020Comments
-
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 about 11 yearsThis 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 almost 4 yearsKindly add comments to make the code more understandable
-
Manash Ranjan Dakua almost 4 yearsHi 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