I am trying to make a program that implements a new stack every time the capacity of the previous stack is exceeded. Therefore, implementing many stacks in the same program. Here is the code:
The pop() method does not work. A new stack is created every time I add an element, but the capacity of a stack should be 10. Thus, a new stack should only be created after I added 10 elements. There is an exception in thread "main" because "this.top" is null. I don't understand why the program is not working.
Thank you!
Java:
package StackOfPlate;
import java.util.ArrayList;
import java.util.Stack;
public class StackOfPlates3 {
public static class Node {
public Node above, below;
public int value;
public Node (int value) {
this.value = value;
}
}
public static class SetOfStacks {
ArrayList <Stack> stacks = new ArrayList<Stack>();
public int capacity;
public SetOfStacks(int capacity) {
this.capacity = capacity;
}
public Stack getLastStack() {
if (stacks.size() == 0) {
return null;
}
return stacks.get(stacks.size()-1);
}
public void push (int v) {
Stack last = getLastStack();
if (last != null && !last.isFull()) {
last.push(v);
System.out.println("Element Pushed on Stack is :" + v);
} else {
Stack stack = new Stack (capacity);
System.out.println("A new stack was created.");
stack.push(v);
System.out.println("Element Pushed on Stack is :" + v);
stacks.add(stack);
}
}
public int pop() {
Stack last = getLastStack();
if(last == null) {
System.out.println("Stack underflow");
}
int v = last.pop();
System.out.println("Element poped from stack is:"+v);
if(last.size == 0) {
stacks.remove(stacks.size() - 1);
System.out.println("A stack have been removed.");
}
return v;
}
public boolean isEmpty() {
Stack last = getLastStack();
return (last == null || last.isEmpty());
}
public int popAt (int index) {
return leftShift(index, true);
}
public int leftShift (int index, boolean removeTop) {
Stack stack = stacks.get(index);
int removed_item;
if (removeTop) {
removed_item = stack.pop();
} else {
removed_item = stack.removeBottom();
}
if (stack.isEmpty()) {
stacks.remove(index);
} else if(stacks.size() > index + 1) {
int v = leftShift (index + 1, false);
stack.push(v);
}
return removed_item;
}
}
public static class Stack {
private int capacity;
public Node top, bottom;
public int size = 0;
public Stack (int capcity) { this.capacity = capacity; }
public boolean isFull() {return capacity == size;}
public boolean isEmpty() {return size == 0;}
public void join (Node above, Node below) {
if (below != null) {below.above = above;}
if (above != null) {above.below = below;}
}
public boolean push (int v) {
if (size >= capacity) {
return false;
}
size++;
Node n = new Node (v);
if (size == 1) {
bottom = n;
}
join(n, top);
top = n;
return true;
}
public int pop () {
Node t = top;
top = top.below;
size--;
return t.value;
}
public int removeBottom() {
Node b = bottom;
bottom = bottom.above;
if (bottom != null) {
bottom.below = null;
}
size--;
return b.value;
}
}
public static void main(String[] args) {
SetOfStacks impl = new SetOfStacks (10);
System.out.println("--------------");
impl.push(210);
impl.push(310);
impl.push(50);
impl.push(400);
impl.push(410);
impl.push(610);
impl.push(70);
impl.push(4);
impl.push(1);
impl.push(20);
impl.push(21);
impl.push(41);
impl.push(101);
impl.push(8);
impl.push(10);
System.out.println("------------------");
impl.pop();
impl.pop();
impl.pop();
System.out.println("------------------------");
}
}
The pop() method does not work. A new stack is created every time I add an element, but the capacity of a stack should be 10. Thus, a new stack should only be created after I added 10 elements. There is an exception in thread "main" because "this.top" is null. I don't understand why the program is not working.
Thank you!
Last edited: