Close
Close Window

Show Source |    | About   «  9.12. Queues   ::   Contents   ::   9.14. Linear Structure Summary Exercises  »

9.13. Linked Queues

9.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 implements Queue {
  private Link front; // Pointer to front queue node
  private Link rear;  // Pointer to rear queue node
  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; }

  // Check if the queue is empty
  public boolean isEmpty() { return size == 0; }
}

1 / 4 Settings
<<<>>>

Members front and rear are pointers to the front and rear queue elements, respectively.

Created with Raphaël 2.1.2
  • // Linked queue implementation
  • class LQueue implements Queue {
  • private Link front; // Pointer to front queue node
  • private Link rear; // Pointer to rear queue node
  • 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;
  • }
null
5
Created with Raphaël 2.1.2
10
25
front
rear
Proficient Saving... Error Saving
Server Error
Resubmit


1 / 5 Settings
<<<>>>

Let's look at how the enqueue operation works.

Created with Raphaël 2.1.2
  • // Put element on rear
  • public boolean enqueue(Object it) {
  • rear.setNext(new Link(it, null));
  • rear = rear.next();
  • size++;
  • return true;
  • }
null
3
Created with Raphaël 2.1.2
21
30
front
rear
Proficient Saving... Error Saving
Server Error
Resubmit

9.13.2. Linked Dequeue

1 / 8 Settings
<<<>>>

Now for the dequeue operation.

Created with Raphaël 2.1.2
  • // 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
  • }
it
null
3
Created with Raphaël 2.1.2
21
30
front
rear
Proficient Saving... Error Saving
Server Error
Resubmit

9.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.

9.13.3.1. Stack and Queue Summary Questions

   «  9.12. Queues   ::   Contents   ::   9.14. Linear Structure Summary Exercises  »

Close Window