/** * Generic Queue example * Immutable Version, without specifications * SWE 619, Fall 2009 * @author Paul Ammann * September 23, 2009 */ import java.util.*; public class IQueue { private List elements; private int size; public IQueue() { this.elements = new ArrayList(); this.size = 0; } // Note: Added private constructor private IQueue(IQueue current) { this.elements = new ArrayList(current.elements); this.size = current.size; } // Note: Producer version of enQueue public IQueue enQueue (E e) { IQueue result = new IQueue(this); result.elements.add(e); result.size++; return result; } // Note: Observer split from deQueue public E peek () { if (size == 0) throw new IllegalStateException("IQueue.peek"); E result = elements.get(0); return result; } // Note: Producer version of deQueue public IQueue deQueue () { if (size == 0) throw new IllegalStateException("IQueue.deQueue"); IQueue result = new IQueue(this); result.elements.remove(0); result.size--; return result; } public boolean isEmpty() { return size == 0; } public static void main(String[] args) { // Simple exercise to enQueue/deQueue cmd line args // Usage: java Queue item1 item2 item3 ... IQueue q = new IQueue (); for (String arg : args) q = q.enQueue(arg); while (!q.isEmpty() ) { System.out.println(q.peek().toUpperCase()); q = q.deQueue(); } } }