import datastructures.Queue;
import datastructures.NodeQueue;
public class Josephus {
  /** Solution of the Josephus problem using a queue. */
  public static Object Josephus(Queue Q, int k) {
    if (Q.isEmpty()) return null;
    while (Q.size() > 1) {
      System.out.println("  Queue: " + Q + "  k = " + k);
      for (int i=0; i < k; i++) 
        Q.enqueue(Q.dequeue());  // move the front element to the end
      Object e = Q.dequeue(); // remove the front element from the collection 
      System.out.println("    " + e + " is out");      
      }
    return Q.dequeue();  // the winner
  }
  /** Build a queue from an array of objects */
  public static Queue buildQueue(Object a[]) {
    Queue Q = new NodeQueue();
    for (int i=0; i<a.length; i++)
      Q.enqueue(a[i]);
    return Q;
  }
  /** Tester method */
  public static void main(String[] args) {
    String[] a1 = {"Alice", "Bob", "Cindy", "Doug", "Ed", "Fred"};
    String[] a2 = {"Gene", "Hope", "Irene", "Jack", "Kim", "Lance"};
    String[] a3 = {"Mike", "Roberto"};
    System.out.println("First winner is " + Josephus(buildQueue(a1), 3));
    System.out.println("Second winner is " + Josephus(buildQueue(a2), 10));
    System.out.println("Third winner is " + Josephus(buildQueue(a3), 7));
  }
}