7.13. Linked Queues¶
7.13.1. Linked Queues¶
The linked queue implementation is a straightforward adaptation of the linked list. Here is the linked queue class declaration.
// Linked queue implementation
class LQueue<E> implements Queue<E> {
  private Link<E> front; // Pointer to front queue node
  private Link<E> rear;  // Pointer to rear queuenode
  private int size;      // Number of elements in queue
  // Constructors
  LQueue() { init(); }
  LQueue(int size) { init(); } // Ignore size
  // Initialize queue
  void init() {
    front = rear = new Link<E>(null);
    size = 0;
  }
  // Put element on rear
  public boolean enqueue(E it) {
    rear.setNext(new Link<E>(it, null));
    rear = rear.next();
    size++;
    return true;
  }
  // Remove and return element from front
  public E dequeue() {
    if (size == 0) return null;
    E it = front.next().element(); // Store the value
    front.setNext(front.next().next()); // Advance front
    if (front.next() == null) rear = front; // Last element
    size--;
    return it; // Return element
  }
  // Return front element
  public E frontValue() {
    if (size == 0) return null;
    return front.next().element();
  }
  // Return queue size
  public int length() { return size; }
}
// Linked queue implementation
class LQueue implements Queue {
  private Link front; // Pointer to front queue node
  private Link rear;  // Pointer to rear queuenode
  private int size;   // Number of elements in queue
  // Constructors
  LQueue() { init(); }
  LQueue(int size) { init(); } // Ignore size
  // Initialize queue
  private void init() {
    front = rear = new Link(null);
    size = 0;
  }
  // Put element on rear
  boolean enqueue(Object it) {
    rear.setNext(new Link(it, null));
    rear = rear.next();
    size++;
    return true;
  }
  // Remove and return element from front
  Object dequeue() {
    if (size == 0) return null;
    Object it = front.next().element(); // Store the value
    front.setNext(front.next().next()); // Advance front
    if (front.next() == null) rear = front; // Last Object
    size--;
    return it; // Return Object
  }
  // Return front element
  Object frontValue() {
    if (size == 0) return null;
    return front.next().element();
  }
  // Return queue size
  int length() { return size; }
}
// Linked queue implementation
class LQueue implements Queue {
  private Link front; // Pointer to front queue node
  private Link rear;  // Pointer to rear queuenode
  private int size;   // Number of elements in queue
  // Constructors
  LQueue() { init(); }
  LQueue(int size) { init(); } // Ignore size
  // Initialize queue
  void init() {
    front = rear = new Link(null);
    size = 0;
  }
  // Put element on rear
  public boolean enqueue(Object it) {
    rear.setNext(new Link(it, null));
    rear = rear.next();
    size++;
    return true;
  }
  // Remove and return element from front
  public Object dequeue() {
    if (size == 0) return null;
    Object it = front.next().element(); // Store the value
    front.setNext(front.next().next()); // Advance front
    if (front.next() == null) rear = front; // Last element
    size--;
    return it; // Return element
  }
  // Return front element
  public Object frontValue() {
    if (size == 0) return null;
    return front.next().element();
  }
  // Return queue size
  public int length() { return size; }
}
7.13.3. Comparison of Array-Based and Linked Queues¶
All member functions for both the array-based and linked queue implementations require constant time. The space comparison issues are the same as for the equivalent stack implementations. Unlike the array-based stack implementation, there is no convenient way to store two queues in the same array, unless items are always transferred directly from one queue to the other.


 
  
