Java Stack
- Java Stack Tutorial Video
- Java Stack Basics
- Create a Stack
- Create a Stack with a Generic Type
- Push Element on Stack
- Pop Element From Stack
- Peek at Top Element of Stack
- Search the Stack
- Stack Size
- Iterate Elements of Stack
- Process Stack Using Stream
- Reverse List Using Stack
- Use a Java Deque as a Stack
- Stack Use Cases
Jakob Jenkov |
The Java Stack class, java.util.Stack, is a classical stack data structure.
You can push elements to the top of a Java Stack and pop them again, meaning read and remove
the elements from the top of the stack.
The Java Stack class actually implements the Java List interface,
but you rarely use a Stack as a List - except perhaps if you need to inspect
all elements currently stored on the stack.
Please note, that the Java Stack class is a subclass of Vector, an older Java class which is synchronized. This synchronization adds a small overhead to calls to all methods of a Stack. Additionally, the Vector class uses several older (no longer recommended) parts of Java, like the Enumeration which is superseded by the Iterator interface. If you want to avoid these issues you can use a Java Deque as a stack instead.
Java Stack Tutorial Video
If you prefer video, I have a Java Stack tutorial video here: Java Stack Tutorial Video.
Java Stack Basics
A Stack is a data structure where you add elements to the "top" of the stack, and also remove
elements from the top again. This is also referred to as the "Last In First Out (LIFO)" principle. In contrast, a
Java Queue uses a "First In First Out (FIFO)" principle, where elements are added
to the end of the queue, and removed from the beginning of the queue.
Create a Stack
To use a Java Stack you must first create an instance of the Stack class.
Here is an example of creating a Java Stack instance:
Stack stack = new Stack();
Create a Stack with a Generic Type
You can set a generic type on a Stack specifying the type of objects the Stack instance can contain. You specify the stack type when you declare the Stack variable. Here is an example of creating a Java Stack with a generic type:
Stack<String> stack = new Stack<String>();
The Stack created above can only contain String instances.
Using a generic type on your Stack instances is recommended as it simplifies your code (no casts needed when accessing objects on the Stack), and decreases the risk that you push an object of the wrong type on the Stack.
Push Element on Stack
Once you have a Java Stack instance, you can push elements to the top of the Stack.
The elements you push onto the Stack must be Java objects. Thus, you actually push objects
to the Stack.
You push elements onto a Java Stack using its push() method.
Here is an example of pushing an element (object) onto a Java Stack:
Stack<String> stack = new Stack<String>();
stack.push("1");
This Java example pushes a Java String with the text 1 onto the
Stack. The String 1 is then stored at the top of the Stack.
Pop Element From Stack
Once an element has been pushed onto a Java Stack, you can pop that element from the
Stack again. Once an element is popped off the Stack, the element is removed
from the Stack. The top element of the Stack is then whatever element that was
pushed onto the Stack just before the element just popped.
You pop an element off a Java Stack using the pop() method. Here is an example of
popping an element off a Stack using the pop() method:
Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.pop();
Once an element is popped off a Stack, the element is no longer present on the Stack.
Peek at Top Element of Stack
The Java Stack class has a method called peek() which enables you to see what the top
element on the Stack is, without popping off the element. Here is an example of peeking at the top
of a Java Stack:
Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.peek();
After running this Java example the topElement variable will contain the String object 1
which was pushed onto the Stack just before peek() was called. The String object
is still present on the Stack after calling peek().
Search the Stack
You can search for an object on the stack to get it's index, using the search()
method. The object's equals() method is called on every object on the Stack
to determine if the searched-for object is present on the Stack. The index you get
is the index from the top of the Stack, meaning the top element on the Stack
has index 1.
Here is how you search a Stack for an object:
Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int index = stack.search("3"); //index = 3
Stack Size
You can obtain the size of a Java Stack, meaning the number of elements currently stored on the Stack, via
the Stack size() method. Here is an example of obtaining the size of a Java Stack via its
size() method:
Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int size = stack.size();
After running this code the size variable will contain the value 3, since the Stack in the
example contains 3 elements at the time its size() method is called.
Iterate Elements of Stack
You can iterate the elements of a Java Stack by obtaining a Java Iterator
from the Stack. You obtain an Iterator by calling the Stack iterator()
method. Here is an example of obtaining an Iterator from a Java Stack and iterating it:
Stack<String> stack = new Stack<String>();
stack.push("123");
stack.push("456");
stack.push("789");
Iterator iterator = stack.iterator();
while(iterator.hasNext()){
Object value = iterator.next();
}
Process Stack Using Stream
It is also possible to process the elements on a Java Stack via the
Java Stream API. You do so by
first obtaining a Stream from the Stack via the stream() method.
Once you have obtained a Stream from the Stack, you can process the elements in the
stream. Here is an example of obtaining a Stream from a Stack and processing the
elements:
Stack<String> stack = new Stack<String>();
stack.push("A");
stack.push("B");
stack.push("C");
Stream stream = stack.stream();
stream.forEach((element) -> {
System.out.println(element); // print element
});
Notice, that this example uses a Java Lambda as parameter to the
Stream.forEach() method. The lambda just prints out the element to System.out
Reverse List Using Stack
You can use a Java Stack to reverse a Java List. You do so by pushing all the
elements from the List onto the Stack, starting with the element with index 0,
then 1 etc. Each element is removed from the List, then pushed onto the Stack.
Once all the elements are on the Stack, you pop the elements off one by one
and add them back to the empty list. Here is an example of reversing a Java List using a
Java Stack:
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list);
Stack<String> stack = new Stack<String>();
while(list.size() > 0) {
stack.push(list.remove(0));
}
while(stack.size() > 0){
list.add(stack.pop());
}
System.out.println(list);
Use a Java Deque as a Stack
As mentioned at the top of this Java Stack tutorial, you can use a Java Deque as a stack too. The Java Deque tutorial also shows how you can do that - but I will show you a short example here too:
Deque<String> dequeAsStack = new ArrayDeque>String>();
dequeAsStack.push("one");
dequeAsStack.push("two");
dequeAsStack.push("three");
String one = dequeAsStack.pop();
String two = dequeAsStack.pop();
String three = dequeAsStack.pop();
As you can see, it looks pretty similar to using a regular Java Stack.
Stack Use Cases
A Stack is really handy for some types of data processing,
for instance if you are parsing an XML file using either SAX
or StAX. For an example, see my Java SAX Example
in my Java XML tutorial.
| Tweet | |
Jakob Jenkov | |











