Stack is a linear data structure consisting of items sorted in Last In First Out (LIFO) order due to adding or removing stack items is only possible at the top
You can think of a stack data structure similar to a stack of plates in real life
In this tutorial, we will learn to implement a Stack
data structure and its operations with Java, including
Push: adds an item onto a stack
Pop: retrieves and removes the top item from a stack
Peek: retrieves without removes the top item from a stack
We will also quickly walk through some official supports of Stack in Java such as java.util.Deque
, java.util.concurrent.BlockingDeque
and java.util.Stack
Implementation
You can implement a stack by using either a Linked List or an Array Data Structure
The following is an implementation example using a static array
import java.util.NoSuchElementException;
public class StackByArray {
private int[] stack;
private int top;
public StackByArray(int capacity) {
stack = new int[capacity];
top = -1;
}
public void push(int x) {
if (isFull()) {
throw new IllegalStateException();
}
stack[++top] = x;
}
public int pop() {
if (isEmpty()) {
throw new NoSuchElementException();
}
return stack[top--];
}
public int peek() {
if (isEmpty()) {
throw new NoSuchElementException();
}
return stack[top];
}
public boolean isEmpty() {
return top == -1;
}
public boolean isFull() {
return top == stack.length - 1;
}
public int size() {
return top + 1;
}
public static void main(String[] args) {
StackByArray myStack = new StackByArray(3);
myStack.push(4);
myStack.push(2);
myStack.push(5);
System.out.println(myStack.peek()); // 5
System.out.println(myStack.pop()); // 5
System.out.println(myStack.peek()); // 2
System.out.println(myStack.size()); // 2
System.out.println(myStack.isEmpty()); // false
System.out.println(myStack.isFull()); // false
}
}
Application
- Depth First Search uses a stack to track which elements to visit next
Stack implementations in Java
java.util.Deque
(interface), since Java 1.6, unsynchronized / not thread-safe, using in single threaded environment. For example
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.peek();
stack.pop();
java.util.concurrent.BlockingDeque
(interface), since Java 1.6, synchronized / thread-safe, using in multi threaded environment. For example
BlockingDeque<Integer> stack = new LinkedBlockingDeque<>();
stack.push(1);
stack.peek();
stack.pop();
java.util.Stack
(class), since Java 1.1, extendsVector
, synchronized, should not be used due to its negative impact on performance