// File: LetterQueue.java
// Time-stamp: "2005-09-17 19:12:27 calvanese"
// Purpose: Written exam 2/2/2005 - BSc in Computer Science (8CFU)
//          solution part 1

class Node {
  String letter;
  Node next;
}


public class LetterQueue {

  // representation of the objects
  private String city;
  private Node first, last;

  // pubblic methods

  public LetterQueue(String c) {
    city = c;
    first = null;
    last = null;
  }
  
  public String getCity() {
    return city;
  }
  
  public void newLetter(String letter) {
    if (first == null) {
      last = new Node();
      first = last;
    } else {
      last.next = new Node();
      last = last.next;
    }
    last.letter = letter;
    last.next = null;
  }
  
  public String firstLetter() throws LetterQueueException {
    if (first != null)
      return first.letter;
    else
      throw new LetterQueueException("Letter queue is empty.");
  }

  public void removeLetter() throws LetterQueueException {
    if (first != null)
      first = first.next;
    else
      throw new LetterQueueException("Letter queue is empty.");
  }

  public int numLetters() {
    Node aux = first;
    int count = 0;
    while (aux != null) {
      count++;
      aux = aux.next;
    }
    return count;
  }
  
  public String letter(int pos) throws LetterQueueException {
    Node aux = first;
    if (pos >= 0 && pos < numLetters()) {
      while (pos > 0) {
        pos--;
        aux = aux.next;
      }
      return aux.letter;
    }
    else
      throw new LetterQueueException("Invalid letter position.");
  }

  public int[] shortLetters(int len) {
    int[] res = new int[numShortLetters(len)];
    int pos = 0;
    Node aux = first;
    int count = 0;
    while (aux != null) {
      if (aux.letter != null && aux.letter.length() < len) {
        res[pos] = count;
        pos++;
      }
      count++;
      aux = aux.next;
    }
    return res;
  }

  private int numShortLetters(int len) {
    Node aux = first;
    int count = 0;
    while (aux != null) {
      if (aux.letter != null && aux.letter.length() < len)
        count++;
      aux = aux.next;
    }
    return count;
  }

}
