Title: Queue, Deque, and Priority Queue Implementations
1Queue, Deque, and Priority Queue Implementations
2Chapter Contents
- Linked List Implementation of a Queue
- Array-Based Implementation of a Queue
- Circular Array
- Circular Array with One Unused Location
- Vector-Based Implementation of a Queue
- Circular Linked Implementations of a Queue
- Two-Part Circular Linked Chain
- Doubly Linked Implementation of a Queue
- Possible Implementations of a Priority Queue
3A Linked Implementation of a Queue
- Use chain of linked nodes for the queue
- Two ends at opposite ends of chain
- Accessing last node inefficient
- Could keep a reference to the tail of the chain
- Place front of queue at beginning of chain
- Place back of queue at end of chain
- With references to both
4A Linked Implementation of a Queue
Front of queue
Back of queue
Fig. 23-1 A chain of linked nodes that implements
a queue.
5A Linked Implementation of a Queue
Fig. 23-2 (a) Before adding a new node to an
empty chain (b) after adding to it.
6A Linked Implementation of a Queue
Fig. 23-3 (a) Before adding a new node to the end
of a chain (b) after adding it.
7A Linked Implementation of a Queue
Fig. 23-4 (a) A queue of more than one entry (b)
after removing the queue's front.
8A Linked Implementation of a Queue
Fig. 23-5 (a) A queue of one entry (b) after
removing the queue's front.
9Array-Based Implementation of a Queue
- Let queue0 be the front
- frontIndex, backIndex are indices of front and
back - If we insist queue0 is front
- Must shift entries when we remove the front
- Instead move frontIndex
- Problem then is array can become full
- But now beginning of array could be empty and
available for use
10Array-Based Implementation of a Queue
Fig. 23-6 An array that represents a queue
without shifting its entries (a) initially (b)
after removing the front twice
11Array-Based Implementation of a Queue
Fig. 23-6 An array that represents a queue
without shifting its entries (c) after several
more additions removals (d) after two
additions that wrap around to the beginning of
the array
12A Circular Array
- When queue reaches end of array
- Add subsequent entries to beginning
- Array behaves as though it were circular
- First location follows last one
- Use modulo arithmetic on indicesbackIndex
(backIndex 1) queue.length - Note with circular array frontIndex
backIndex 1both when queue is empty and when
full
13A Circular Array
Fig. 23-7 A circular array that represents a
queue (a) when full (b) after removing 2
entries (c) after removing 3 more entries
14A Circular Array
Fig. 23-7 A circular array that represents a
queue (d) after removing all but one entry
(e) after removing remaining entry.
15A Circular Array with One Unused Location
Allows us to distinguish between empty and full
queue
Fig. 23-8 A seven-location circular array that
contains at most six entries of a queue
continued ?
16A Circular Array with One Unused Location
Fig. 23-8 (ctd.) A seven-location circular array
that contains at most six entries of a queue.
17Array-Based Implementation of a Queue
Fig. 23-9 An array-base queue (a) initially (b)
after removing its front by incrementing
frontIndex (sloppy)
18Array-Based Implementation of a Queue
Fig. 23-9 An array-base queue (c) after removing
its front by setting queuefrontIndex to null
(clean) and then incrementing frontIndex.
19Vector-Based Implementation of a Queue
- Keep front of queue at beginning of vector
- Use addElement to add entry at back
- Vector expands as necessary
- When removing front element, remaining elements
move so new front is at beginning of vector - Indexes at front and back not needed
20Vector-Based Implementation of a Queue
Fig. 23-10 A vector that represents a queue.
21Circular Linked Implementations of a Queue
- Last node references first node
- Now we have a single reference to last node
- And still locate first node quickly
- No node contains a null
- When a class uses circular linked chain for queue
- Only one data item in the class
- The reference to the chain's last node
22Circular Linked Implementations of a Queue
Fig. 23-11 A circular linked chain with an
external reference to its last node that (a) has
more than one node (b) has one node (c) is
empty.
23A Two-Part Linked Chain
- Linked nodes that form the queue followed by
nodes available for use in the queue - queueNode references front of queue node
- freeNode references first available node
following end of queue - In essence we have two chains
- One for the queue
- One for available nodes
- All joined in a circle
24A Two-Part Linked Chain
Fig. 32-12 A two-part circular linked chain that
represents both a queue and the nodes available
to the queue.
25A Two-Part Linked Chain
queueNode is the front
Fig. 32-13 A two-part circular linked chain that
represents a queue (a) when it is empty (b)
after adding one entry (c) after adding three
more entries.
26A Two-Part Linked Chain
Fig. 32-13 A two-part circular linked chain that
represents a queue (d) after removing the front
(e) after adding one more entry
27A Two-Part Linked Chain
Fig. 32-14 A chain that requires a new node for
an addition to a queue (a) before the addition
(b) after the addition.
28A Two-Part Linked Chain
Fig. 32-15 A chain with a node available for an
addition to a queue (a) before the addition (b)
after the addition.
29Doubly Linked Implementation of Deque
- Chain with head reference enables reference to
first and then rest of the nodes - Tail reference allows reference to last node but
not next-to-last - We need nodes that can reference both
- Previous node
- Next node
- Thus the doubly linked chain
30A Doubly Linked Implementation of a Deque
Fig. 23-16 A doubly linked chain with head and
tail references
31A Doubly Linked Implementation of a Deque
Fig. 23-17 Adding to the back of a non empty
deque (a) after the new node is allocated (b)
after the addition is complete.
32A Doubly Linked Implementation of a Deque
Fig. 23-18 (a) a deque containing at least two
entries (b) after removing first node and
obtaining reference to the deque's first entry.
33Possible Implementations of a Priority Queue
Fig. 23-19 Two possible implementations of a
priority queue using (a) an array (b) a chain of
linked nodes.