Queue Basics

 
/**
 * QUEUE BASICS - COLLECTIONS
 * --------------------------
 * Queue = Fist In, First Out
 * 
 * Example:
 * --------
 * Think of line at supermarket:
 *  - First persion in line, first served
 *  - New people join at the enc
 * 
 * Operations:
 * -----------
 *  - add() / offer - add to the end
 *  - remove() / poll() - remove from front
 *  - element / peek() - view front element
 * 
 * Java provides two versions of the same operations to handle failure differently:
 * --------------------------------------------------------------------------------
 *  - add() throw exception if fails
 *  - offer() return false if fails
 * 
 *  - remove() throws exception if empty
 *  - poll() return null if empty
 * 
 *  - element() throws exception if empty
 *  - peek() return null if empty
 * 
 * Best practice:
 * -------------
 * Prefer offer(), poll(), peek().
 * They are safer and more commonly used.
 */

package com.minte9.collections.queues;

import java.util.ArrayDeque;
import java.util.Queue;

public class QueueBasics {
    public static void main(String[] args) {
        
        // Create a Queue
        Queue<String> queue = new ArrayDeque<>();

        // Add elements (People entering line)
        queue.offer("Alice");
        queue.offer("Bob");
        queue.offer("Charlie");

        // View front (Next to be served)
        String first = queue.peek();
        System.out.println("Next customer: " + first);  // Alice

        // Remove element (Serving customer)
        String served = queue.poll();
        System.out.println("Served: " + served);  // Alice
        System.out.println("Queue after serving: " + queue);  // [Bob, Charlie]

        // Add more people
        queue.offer("Diana");
        queue.offer("Eva");
        System.out.println("Updated queue: " + queue);  // [Bob, Charlie, Diana, Eva]

        // Process entire queue
        while (!queue.isEmpty()) {
            System.out.println("Serving: " + queue.poll()); 
                // Bob
                // Charlie ...
        }
    }
}

Deque Example

 
/**
 * DEQUE - COLLECTIONS
 * -------------------
 * It allows insertion and removal from BOTH ends:
 * This makes it more powerful than a Queue.
 * 
 * Queue:
 *  - FIFO (First In, First Out)
 *  - Add: at end
 *  - Remove: from front
 * 
 * Deque:
 *  - FIFO (like Queue)
 *  - LIFO (like Stack)
 *  - Add/remove from BOTH ends
 * 
 * Advantages over Queue:
 * ----------------------
 * More flexible:
 *  - addFirst(), addLat()
 *  - removeFirst(), removeLast()
 * 
 * Better performance with ArrayDeque.
 * 
 * Best practice:
 *  - Use Deque for most cases
 */

package com.minte9.collections.queues;

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeExample {
    public static void main(String[] args) {
        
        // Create Deque
        Deque<String> deque = new ArrayDeque<>(); // Both ends (not like Queue)

        // Use as queue (FIFO)
        deque.offerLast("Alice");  // same as addLast (but better)
        deque.offerLast("Bob");
        deque.offerLast("Charlie");
        System.out.println("Serve: " + deque.pollFirst()); // remove from front (Alice)

        // Use as stack (LIFO)
        deque.push("X");  // same as addFirst
        deque.push("Y");
        deque.push("Z");
        System.out.println("Pop: " + deque.pop());  // Z

        // Working with both end
        deque.addFirst("Start");
        deque.addLast("End");
        System.out.println(deque);  // [Start, Y, X, Bob, Charlie, End]
        System.out.println("Remove first: " + deque.removeFirst());  // Start
        System.out.println("Remove last: " + deque.removeLast());  // End

        // Peek operations
        System.out.println("Peek first: " + deque.peekFirst());  // Y
        System.out.println("Peek last: " + deque.peekLast());  // Charlie

    }
}