Hello, dear student! Today's lesson will take you on an exciting journey through Stacks, a powerful tool in Java. In programming, Stacks are fundamental data structures utilized in various applications. Our goal for this lesson is to understand the concept of Stacks, learn how to implement and manipulate them in Java and delve deep into their complexities. Let's get started!
First and foremost, let's understand what a Stack is. Imagine a stack of plates that you can only remove from the top. That's precisely what a Stack is: a Last-In, First-Out (LIFO) structure. Stacks are used in memory management, backtracking algorithms, and more. The key operations involved are Push
(adding an element to the top of the stack), Pop
(removing the topmost element), and Peek
(looking at the topmost element without removing it).
Java provides two common ways to implement Stacks: Array-based and Linked-list-based. In the former, we use an array to store the elements to create the Stack; in the latter, we use a linked list instead. Let's look into creating a Stack using an array in Java:
Java1class Stack{ 2 int size; 3 int top=-1; 4 int[] stackArray; 5 6 public Stack(int size){ 7 this.size = size; 8 stackArray = new int[size]; 9 } 10}
top
represents the index in the stackArray that is currently the top element of the stack. It is initialized to -1
, showing the stack is empty, and there is no valid index for the top element.
A Stack involves three operations - Push
, Pop
, and Peek
. In an array-based Stack, the Push
operation adds a new element at the top of the Stack. Here’s how we can write a push function:
Java1public void push(int data){ 2 if(top < size - 1){ 3 stackArray[++top] = data; 4 } else { 5 System.out.println("Stack Overflows"); 6 } 7}
Before adding the element, the method checks if the stack is full by comparing top
with size-1
(maximum array index). If it's less, we still have room to insert the element; otherwise, it gives a "Stack Overflows" message. The ++top
operation increments the top
variable (which represents the top element index in the stack) by one and then uses this new value as an index to add the data
element into the stackArray
.
The Pop
operation removes the topmost element from the Stack.
Java1public int pop() { 2 if (top > -1) { 3 return stackArray[top--]; 4 } else { 5 System.out.println("Stack Underflows"); 6 return -1; 7 } 8}
This method removes and returns the top item of the stack. It checks if the stack is empty by checking if top
is greater than -1
. If it is, it decrements top
and returns the element that was just removed from the top of the stack. Notice that we do not actually remove the element from the array. We decrease the top
variable, so it no longer points to the popped element.
Lastly, the Peek
operation returns the topmost element without removing it from the Stack.
Java1public int peek() { 2 if (top > -1) { 3 return stackArray[top]; 4 } else { 5 System.out.println("Stack is Empty"); 6 return -1; 7 } 8}
Since we perform them at one end of the data structure, the Push
, Pop
, and Peek
operations take constant time, represented as O(1). Space complexity refers to the space taken by the Stack, proportional to the number of elements. Hence, it is represented as O(n), where n
is the number of elements in the Stack.
While understanding the stack's inner structure is vital for knowing its possibilities, we don't need to implement it ourselves. Java provides a built-in Stack class located in the java.util
package. This class offers methods to perform the necessary operations such as push()
, pop()
, peek()
etc.
Here's an example of how you can use the built-in Stack class.
Java1import java.util.Stack; 2 3class Main { 4 public static void main(String[] args) { 5 Stack<Integer> stack = new Stack<>(); 6 7 // Performing the push operation 8 stack.push(10); 9 stack.push(20); 10 stack.push(30); 11 12 System.out.println("Stack: " + stack); 13 14 // Performing the pop operation 15 int popped = stack.pop(); 16 System.out.println("Popped from stack: " + popped); 17 18 // Performing the peek operation 19 int peeked = stack.peek(); 20 System.out.println("Peeked from stack: " + peeked); 21 } 22}
The output will be:
1Stack: [10, 20, 30] 2Popped from stack: 30 3Peeked from stack: 20
This example showcases the creation of a Stack and the utilization of the push()
, pop()
, and peek()
methods. Besides these operations, Java's Stack class also includes methods like isEmpty()
to check if the stack is empty, search(Object o)
to find the 1-based position from the top of the stack where an object is located, remove(Object o)
and remove(int index)
to remove an object or an object at a specific index, and others.
Congratulations, you've completed the lesson on Stacks in Java! You will now proceed to the practice sessions using the concepts learned here. These hands-on practice exercises will help solidify your knowledge and improve your problem-solving skills. So, get ready to roll up your sleeves and dive right in!