Queue
The Queue - Introduction
Definition: A queue is an ordered collection of items where the addition of
new items happens at one end, called the “rear,” and the removal of existing
items occurs at the other end, commonly called the “front.”
Queues maintain a “First In First Out (FIFO)” ordering property.
Queue
3.3
Uses a explicit linear ordering (follows FIFO)
Insertions and removals are performed individually
There are no restrictions on objects inserted into (Enqueue) the
queue—that object is designated the back of the queue
The object designated as the front of the queue is the object which was
in the queue the longest
The remove operation (Dequeue from the queue) removes the current
front of the queue
Queue
3.3.1
Graphically, we may view these operations as follows:
Enqueue
Dequeue
Abstract Queue
3.3.1
There are two exceptions associated with this abstract data
structure:
Calling pop on an empty queue
Calling front on an empty queue
Implementation of Queue
1. Using Arrays
2. Using Linked Lists
Implementation of Queue using arrays
void main( ) i = delq ( arr, &front, &rear ) ;
{ printf ( "\nItem deleted: %d", i ) ;
int arr[MAX] ;
int front = -1, rear = -1, i ; i = delq ( arr, &front, &rear ) ;
printf ( "\nItem deleted: %d", i ) ;
addq ( arr, 23, &front, &rear ) ;
addq ( arr, 9, &front, &rear ) ; i = delq ( arr, &front, &rear ) ;
addq ( arr, 11, &front, &rear ) ; printf ( "\nItem deleted: %d", i ) ;
addq ( arr, -10, &front, &rear ) ;
addq ( arr, 25, &front, &rear ) ; }
addq ( arr, 16, &front, &rear ) ;
addq ( arr, 17, &front, &rear ) ;
addq ( arr, 22, &front, &rear ) ;
addq ( arr, 19, &front, &rear ) ;
addq ( arr, 30, &front, &rear ) ;
addq ( arr, 32, &front, &rear ) ;
Implementation of Queue using arrays
/* removes an element from the queue
*/
/* adds an element to the queue */ int delq ( int *arr, int *pfront, int *prear )
void addq ( int *arr, int item, int {
*pfront, int *prear ) int data ;
{
if ( *prear == MAX - 1 ) if ( *pfront == -1 )
{ {
printf ( "\nQueue is full." ) ; printf ( "\nQueue is Empty." ) ;
return ; return NULL ;
} }
data = arr[*pfront] ;
( *prear )++ ; arr[*pfront] = 0 ;
arr[*prear] = item ; if ( *pfront == *prear )
*pfront = *prear = -1 ;
if ( *pfront == -1 ) else
*pfront = 0 ; ( *pfront )++ ;
} return data ;
}
Queue using Arrays…
What is the problem in this code?
• Let us fix the array capacity (maxsize) as 5
[0] [1] [2] [3] [4]
• Perform 5 push operations
[0] [1] [2] [3] [4]
5 10 15 20 25 Queue is full
• Perform 2 pop operations
[0] [1] [2] [3] [4]
15 20 25 Queue has 2 free slots??
Queue using Arrays…
What is the problem in this code…?
• Perform 2 pop operations
[0] [1] [2] [3] [4]
Free Free 15 20 25 Queue has 2 free slots
In front of the queue !!
In this case, the array is not full and yet we cannot place any more objects
in to the array. Why??
[0] [1] [2] [3] [4]
15 20 25
Front Rear
Queue using Arrays…
What is the solution?
1. Shift array elements after each deletion – Very expensive (You can try)
2. Cyclic arrays - Instead of viewing the array as linear, on the range “0, 1,
2, 3, 4”, consider the indices by cyclic.
0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0,……
Queue using Circular Array…
What is the solution?
Now the next push can be performed into the next available location of
the circular array.
Queue using Circular Array…
Using Circular Array
Problem: front and rear no longer can be used as condition to
distinguish between queue‐full and queue‐empty.
Solution:
• Use a counter
o If count==0 Queue is Empty
o If count==maxsize Queue is full
Disadvantage: Overhead of maintaining counter variable
Deque
3.4.1
Uses a explicit linear ordering
Insertions and removals are performed individually
Allows insertions at both the front and back of the deque
Deque
3.4.1
The operations will be called
front back
push_front push_back
pop_front pop_back
There are four errors associated with this abstract data type:
It is an undefined operation to access or pop from an empty
deque
Assignment:
3.4.1
Write a C Program implements linked list as a queue
Write a C Program implements array as a queue