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.
It sets the top element in the stack to null. I replied @disqus_vKBibcHypO:disqus’s solution.
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;
Right, it’s corrected.
Right.
array[headPos–] = null;
what mean?
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];
}
}
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
Also, it should return true after adding the element
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.
Since a field ‘top’ exists, there is no need to maintain the stack’s size, hence the field ‘size’.