Implement a Stack Using an Array in Java

This post shows how to implement a stack by using an array.

The requirements of the stack are: 1) the stack has a constructor which accepts a number to initialize its size, 2) the stack can hold any type of elements, 3) the stack has a push() and a pop() method.

A Simple Stack Implementation

public class Stack<E> {
	private E[] arr = null;
	private int CAP;
	private int top = -1;
	private int size = 0;
 
	@SuppressWarnings("unchecked")
	public Stack(int cap) {
		this.CAP = cap;
		this.arr = (E[]) new Object[cap];
	}
 
	public E pop() {
		if(this.size == 0){
			return null;
		}
 
		this.size--;
		E result = this.arr[top];
		this.arr[top] = null;//prevent memory leaking
		this.top--;
 
		return result;
	}
 
	public boolean push(E e) {
		if (isFull())
			return false;
 
		this.size++;
		this.arr[++top] = e;
 
		return true;
	}
 
	public boolean isFull() {
		if (this.size == this.CAP)
			return false;
		return true;
	}
 
	public String toString() {
		if(this.size==0){
			return null;
		}
 
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<this.size; i++){
			sb.append(this.arr[i] + ", ");
		}
 
		sb.setLength(sb.length()-2);
		return sb.toString();	
	}
 
	public static void main(String[] args) {
 
		Stack<String> stack = new Stack<String>(11);
		stack.push("hello");
		stack.push("world");
 
		System.out.println(stack);
 
		stack.pop();
		System.out.println(stack);
 
		stack.pop();
		System.out.println(stack);
	}
}

Output:

hello, world
hello
null

This example is used twice in "Effective Java". In the first place, the stack example is used to illustrate memory leak. In the second place, the example is used to illustrate when we can suppress unchecked warnings.

You may check out how to implement a queue by using an array.

Category >> Algorithms  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>
  • ryanlr

    It sets the top element in the stack to null. I replied @disqus_vKBibcHypO:disqus’s solution.

  • ryanlr

    Setting null for the stack top (array[headPos–] = null;) will make (return array[headPos + 1];) return null;
    So the stack top needs to be saved first.


    T top = array[headPos];
    array[headPos--] = null;
    return top;

  • ryanlr

    Right, it’s corrected.

  • ryanlr

    Right.

  • usamkr

    array[headPos–] = null;
    what mean?

  • Marina

    A little simpler than the solution above:
    package structures;

    public class ArrayBasedStack {
    private T[] array;
    private int headPos;

    public ArrayBasedStack(int n) {
    array = (T[]) new Object[n];
    headPos = -1;
    }

    public boolean push(T element) {
    if (headPos == array.length -1 ) {
    return false;
    }
    array[++headPos] = element;
    return true;
    }

    public T pop() {
    if (headPos == -1) {
    return null;
    }
    array[headPos--] = null;
    return array[headPos + 1];
    }

    }

  • Karthiga M Thangaraj

    Hi, Good job! I have one feed back ,When removing an element, array cant resize, and null cant be assigned to integer array or string array also, then only way is to build the new array without the element tat needs to be removed. Even ArrayUtils does that only

  • Harshad Sathe

    Also, it should return true after adding the element

  • HP

    Only minor observation, you have inverted the logic for your isFull() function. Should probably be:

    ”’
    public boolean isFull() {
    if (this.size == this.cap)
    return true; //it is full in this case
    return false;
    }
    ”’

    then on the push(E e) function:
    ”’
    public boolean push(E e) {
    if ( isFull() )
    return false;
    this.size++;
    this.arr[++top] = e;
    return false;
    }
    ”’

    Nice simple example anyway.

  • Aiden Zou

    Since a field ‘top’ exists, there is no need to maintain the stack’s size, hence the field ‘size’.