All you need to know about Stacks and Queues

Share with friends
Save Story for Later (0)
Please login to bookmark Close

Stacks and queues are fundamental data structures in computer science, offering simple yet powerful ways to manage data. They are particularly useful in test automation for managing test cases and ensuring proper execution sequences. This guide will explain stacks and queues, their implementations, and their applications in managing test cases.

What is a Stack?

A stack is a linear data structure that follows the Last In, First Out (LIFO) principle. This means that the last element added to the stack is the first one to be removed. Think of a stack of plates: you add new plates on top and remove the topmost plate when needed.

Key Characteristics of Stacks

  1. LIFO Principle: Last In, First Out.
  2. Push Operation: Adds an element to the top of the stack.
  3. Pop Operation: Removes the top element from the stack.
  4. Peek Operation: Returns the top element without removing it.

Stacks Implementation using Java & Python

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        // Push elements onto the stack
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // Display the stack
        System.out.println("Stack: " + stack);

        // Pop an element from the stack
        int top = stack.pop();
        System.out.println("Popped element: " + top);

        // Display the stack after popping
        System.out.println("Stack after popping: " + stack);

        // Peek the top element
        int peeked = stack.peek();
        System.out.println("Peeked element: " + peeked);
    }
}

// Output:
// Stack: [1, 2, 3]
// Popped element: 3
// Stack after popping: [1, 2]
// Peeked element: 2
class Stack:
    def __init__(self):
        self.items = []
    
    def push(self, item):
        self.items.append(item)
    
    def pop(self):
        if not self.is_empty():
            return self.items.pop()
    
    def peek(self):
        if not self.is_empty():
            return self.items[-1]
    
    def is_empty(self):
        return len(self.items) == 0
    
    def display(self):
        print("Stack:", self.items)

# Example usage
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.display()

top = stack.pop()
print("Popped element:", top)
stack.display()

peeked = stack.peek()
print("Peeked element:", peeked)

# Output:
# Stack: [1, 2, 3]
# Popped element: 3
# Stack: [1, 2]
# Peeked element: 2

What is a Queue?

A queue is a linear data structure that follows the First In, First Out (FIFO) principle. This means that the first element added to the queue is the first one to be removed. Think of a queue at a checkout counter: the first person in line is the first one served.

Key Characteristics of Queues

  1. FIFO Principle: First In, First Out.
  2. Enqueue Operation: Adds an element to the end of the queue.
  3. Dequeue Operation: Removes the front element from the queue.
  4. Peek Operation: Returns the front element without removing it.

Queue Implementation using Java & Python

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        // Enqueue elements
        queue.add(1);
        queue.add(2);
        queue.add(3);

        // Display the queue
        System.out.println("Queue: " + queue);

        // Dequeue an element
        int front = queue.remove();
        System.out.println("Dequeued element: " + front);

        // Display the queue after dequeueing
        System.out.println("Queue after dequeueing: " + queue);

        // Peek the front element
        int peeked = queue.peek();
        System.out.println("Peeked element: " + peeked);
    }
}

// Output:
// Queue: [1, 2, 3]
// Dequeued element: 1
// Queue after dequeueing: [2, 3]
// Peeked element: 2
class Queue:
    def __init__(self):
        self.items = []
    
    def enqueue(self, item):
        self.items.append(item)
    
    def dequeue(self):
        if not self.is_empty():
            return self.items.pop(0)
    
    def peek(self):
        if not self.is_empty():
            return self.items[0]
    
    def is_empty(self):
        return len(self.items) == 0
    
    def display(self):
        print("Queue:", self.items)

# Example usage
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.display()

front = queue.dequeue()
print("Dequeued element:", front)
queue.display()

peeked = queue.peek()
print("Peeked element:", peeked)

# Output:
# Queue: [1, 2, 3]
# Dequeued element: 1
# Queue: [2, 3]
# Peeked element: 2

Applications in Managing Test Cases

Using Stacks for Test Case Management

Stacks are useful in scenarios where you need to manage test cases that require a LIFO order. For example, when testing nested functions or operations that depend on the completion of the previous one, a stack can ensure that the last test case added is the first one executed.

Example

  • Use Case: Testing nested function calls.
  • Implementation: Push each function call onto the stack, and pop them as they complete, ensuring that the most recent call is handled first.

Using Queues for Test Case Management

Queues are ideal for managing test cases that require a FIFO order. This is common in scenarios where test cases need to be executed in the order they were added, such as processing tasks in a testing pipeline or handling sequential user actions.

Example

  • Use Case: Processing user action sequences.
  • Implementation: Enqueue each user action as it occurs, and dequeue them for processing in the order they were added, ensuring that earlier actions are handled first.

Conclusion

Stacks and queues are essential data structures for managing test cases in test automation. By understanding their principles and applications, you can effectively ensure proper execution sequences and improve the efficiency of your testing processes.

Article Contributors

  • Alfred Algo
    (Author)
    Chief Algorithms Scientist, QABash

    Alfred Algo is a renowned expert in data structures and algorithms, celebrated for his ability to simplify complex concepts. With a background in computer science from a prestigious university, Alfred has spent over a decade teaching and mentoring aspiring programmers. He is the author at the popular blog "The Testing Times," where he shares tips, tutorials, and insights into mastering DSA.

  • Ishan Dev Shukl
    (Reviewer)
    SDET Manager, Nykaa

    With 13+ years in SDET leadership, I drive quality and innovation through Test Strategies and Automation. I lead Testing Center of Excellence, ensuring high-quality products across Frontend, Backend, and App Testing. "Quality is in the details" defines my approach—creating seamless, impactful user experiences. I embrace challenges, learn from failure, and take risks to drive success.

Subscribe to QABash Weekly 💥

Dominate – Stay Ahead of 99% Testers!

Leave a Reply

Scroll to Top