Chapter 4 - QUEUE Ver2
Chapter 4 - QUEUE Ver2
Course Objectives
queue
• Real-World Applications
– Cashier lines in any store
– Bank / ATM
– Call an airline
Queue Applications
– Recognizing palindromes
• Simulation
– A study to see how to reduce the wait
involved in an application
Queue implementation
Remove/ Add/
A B C Enqueue
Dequeue
Front/Head Back/Rear
Add/
A B C D Enqueue
Head Rear
Head Rear
– Destroy a queue
– Retrieve at Front(getFront)
Implementation:
– Array-based (Linear or Circular)
– Pointer-based : Link list (Linear or
Circular)
2.0 Queue Implementation Using
Array(Linear)
Queue Implementation Using
Array(Linear)
• Number of elements in Queue are fixed
during declaration.
• Declare
#include <iostream>
using namespace std;
#define max 5
item
0 0 1 2 3 4 -1
front back
Continue…
enQueue operation
void enQueue(){
cout<<"\n\t#################\n";
cout<<"\n\t1. enQueue\n";
//check queue is full
if(back == max - 1){
cout<<"\n\tQueue Is Full, Cannot Add Item In Queue\n";
}else{
cout<<"\n\t\tEnter Item:";
cin>>newitem;
back++;
item[back]=newitem;
cout<<endl; enQueue
}
} item back++
0 0 1 2 3 4 0
front A back
back = -1+1
back = 0
Front refer to index 0 From back/rear
item[back] = newitem
Continue…
enQueue operation
item back++
0 0 1 2 3 4 1
front A B back
back = 0 +1
back = 1
Front refer to index 0 From back/rear
item[back] = newitem
item back++
0 0 1 2 3 4 2
front A B C back
back = 1 +1
Front refer to index 0 back = 2
From back/rear
item[back] = newitem
Continue…
enQueue operation
item back++
0 0 1 2 3 4 3
front A B C D back
back = 2 +1
back = 3
Front refer to index 0
From back/rear
item[back] = newitem
item back++
0 0 1 2 3 4 4
front A B C D E back
back = 3 +1
back = 4
Front refer to index 0
From back/rear
item[back] = newitem
Continue…
deQueue operation
void deQueue(){
cout<<"\n\t#################\n";
cout<<"\n\t2.deQueue\n";
if(back < front){
cout<<"\n\tThere is no data to remove from queue\n";
}else{
char itemdeleted;
itemdeleted=item[front]; deQueue
item[front] = NULL;
cout<<"\n\tItem Remove From Queue:"<<itemdeleted<<endl;
front++;
}
cout<<endl; item
} 0 4
0 1 2 3 4
front A B C D E back
back = 3 + 1
itemdeleted = item[front] Front refer to index 0 back = 4
front = 0
From front/head
item[front] = NULL Continue…
deQueue operation
front++ item
1 0 1 2 3 4 4
front NULL B C D E back
front = 0 + 1 back = 3 + 1
front = 1 back = 4
itemdeleted = item[front]
From front/head
front = 1
item[front] = NULL
front++ item
2 0 1 2 3 4 4
front NULL NULL C D E back
front = 1 + 1 back = 3 + 1
front = 2 back = 4
item
2 0 1 2 3 4 4
front NULL NULL C D E back
back = 3 + 1
Front refer to index 2 back = 4
From front/head
itemdeleted = item[front] item[front] = NULL
front = 2
front++ item
3 0 1 2 3 4 4
front NULL NULL NULL D E back
front = 2 + 1 back = 3 + 1
front = 3 back = 4
Continue…
deQueue operation
item
3 0 1 2 3 4 4
front NULL NULL NULL D E back
back = 3 + 1
Front refer to index 3 back = 4
front++ item
4 0 1 2 3 4 4
front NULL NULL NULL NULL E back
front = 3 + 1 back = 3 + 1
front = 4 back = 4
Continue…
deQueue operation
item
4 0 1 2 3 4 4
front NULL NULL NULL NULL E back
back = 3 + 1
Front refer to index 4 back = 4
front++ item
5 0 1 2 3 4 4
front NULL NULL NULL NULL NULL back
front = 4 + 1 back = 3 + 1
front = 5 back = 4
Continue…
Retrieve at front(getFront) operation
void getFront(){
cout<<"\n\t#################\n";
cout<<"\n\t3.getFront\n";
if(back < front){
cout<<"\n\tThere is no data to at front\n";
}else{
cout<<"\n\tItem At Front:"<<item[front]<<endl;
}
}
Continue…
Retrieve at back(getRear) operation
void getRear(){
cout<<"\n\t#################\n";
cout<<"\n\t4.getRear\n";
if(back < front){
cout<<"\n\tThere is no data to at rear\n";
}else{
cout<<"\n\tItem At Rear:"<<item[back]<<endl;
}
}
Continue…
destroyQueue operation
void destroyQueue(){
delete [] item;
Continue…
displayQueue operation
void displayQueue(){
cout<<"\n\tDisplay Item In Queue\n";
if(back < front){
cout<<"\n\tThere is no data in queue to be displayed\n";
}else{
cout<<"\t";
for(int i=0; i < max; i++ ){
cout<<"\t"<<item[i];
}
cout<<endl;
}
Continue…
Queue Implementation Using Array(Linear)
int main()
{
int selection;
menu:
cout<<"\nPlease Choose Your Selection\n";
cout<<"\n1\tenQueue\n";
cout<<"\n2\tdeQueue\n";
cout<<"\n3\tGetFront\n";
cout<<"\n4\tGetRear\n";
cout<<"\n5\tDestroyQueue\n";
cout<<"\n6\tDisplay\n";
cout<<"\n\tSelection is:";
cin>>selection;
Continue…
Queue Implementation Using Array(Linear)
switch(selection){
case 1: enQueue();
displayQueue();
goto menu;
break;
case 2: deQueue();
displayQueue();
goto menu;
break;
case 3: getFront();
displayQueue();
goto menu;
break;
Continue…
Queue Implementation Using Array(Linear)
case 4: getRear();
displayQueue();
goto menu;
break;
case 5: destroyQueue();
displayQueue();
goto menu;
break;
case 6: displayQueue();
goto menu;
break;
default:cout<<"\n\tWrong Selection\n";
}
return 0;
}
Queue Implementation Using Array(Linear)
• Problem: Rightward-Drifting:
5 0 1 2 3 4 4
front NULL NULL NULL NULL NULL back
front = 4 + 1 back = 3 + 1
front = 5 back = 4
Queue Implementation Using Array(Linear)
• Solution:
– Use a counter
– Count == 0 means empty queue
– Count == MAX_QUEUE means full
queue
3.0 Queue Implementation Using
Array(Circular)
Queue Implementation Using
Array(Circular)
• Number of elements in Queue are fixed
during declaration.
7 0
6 1
5 2
4 3
back = -1 count = 0
Queue Implementation Using Array(Circular)
– enQueue
• Increment back, using modulo arithmetic
• Insert item
• Increment count
– deQueue
• Increment front using modulo arithmetic
• Decrement count
– Disadvantage
• Overhead of maintaining a counter or
flag
Queue Implementation Using Array(Circular)
Example Code 2:
6 1
#define max 8
back = -1 count = 0
Continue…
Queue Implementation Using Array(Circular)
void enQueue(){
if(count == max){
}else{
cout<<"\n\tfront:"<<front<<"\t"<<"back:"<<back<<"\tcount:"<<count<<“\tmax:”<<max<<"\n";
7 0 back = 0
cin>>newitem;
A
back = (back + 1)% max; 6 1
back = (-1 + 1) % 8
queue[back] = newitem; back = 0 % 8
back = 0 5 2
count++; 0 queue[0] = A
8√ 0 4 3
} } count = 0 + 1
0 count = 1
count = 1
0 Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 0, count = 1 queue
front = 0
7 0
A back = 1
6 1
back = (0 + 1) % 8 B
back = 1 % 8
back = 1 5 2
0 queue[1] = B
8√ 1 4 3
count = 1 + 1
0 count = 2
1 count = 2
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 1, count = 2
queue front = 0
7 0
A
6 1
back = (1 + 1) % 8 B
back = 2 % 8
C
back = 2 5 2 back = 2
0 queue[2] = C
8√ 2 4 3
count = 2 + 1
0 count = 3
2 count = 3
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 2, count = 3
queue
front = 0
7 0
A
6 1
back = (2 + 1) % 8 B
back = 3 % 8
back = 3 C
5 2
0 queue[3] = D D
8√ 3 4 3
count = 3 + 1
0 count = 4
3 count = 4 back = 3
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 3, count = 4
queue
front = 0
7 0
A
6 1
back = (3 + 1) % 8 B
back = 4 % 8
back = 4 C
5 2
0 queue[4] = E E D
8√ 4 4 3
count = 4 + 1
0 count = 5
4 count = 5 back = 4
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 4, count = 5
queue
front = 0
7 0
A
6 1
back = (4 + 1) % 8 B
back = 5 % 8
back = 5 F C
5 2
0 queue[5] = F E D
8√ 5 back = 5 4 3
count = 5 + 1
0 count = 6
5 count = 6
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 5, count = 6
queue
front = 0
back = 6 7 0
A
6 1
back = (5 + 1) % 8 G B
back = 6 % 8
back = 6 F C
5 2
0 queue[6] = G E D
8√ 6 4 3
count = 6 + 1
0 count = 7
6 count = 7
Continue…
enQueue Implementation Using Array(Circular)
From previous slide: front = 0, back = 6, count = 7
queue
back = 7 front = 0
7 0
H A
6 1
back = (6 + 1) % 8 G B
back = 7 % 8
back = 7 F C
5 2
0 queue[7] = H E D
8√ 7 4 3
count = 7 + 1
0 count = 8
7 count = 8
Continue…
deQueue Implementation Using Array(Circular)
void deQueue(){
if(count == 0){
}else{ queue
back = 7
queue[front] = NULL;
7 0
front=(front + 1) % max; H front = 1
6 1
count--; queue[0] = NULL G B
front = (0 + 1) % 8
} front = 1 % 8 F C
5 2
0 front = 1 E D
} 8√ 1 4 3
count = 8 - 1
0 count = 7
1 count = 7
Continue…
deQueue Implementation Using Array(Circular)
From previous slide: front = 1, back = 7 , count = 7
queue
back = 7
7 0
H
6 1
queue[1] = NULL G
front = (1 + 1) % 8
front = 2% 8 F C
5 2
0 front = 2 E D front = 2
8√ 2 4 3
count = 7 - 1
0 count = 6
2 count = 6
Continue…
Queue Implementation Using Array(Circular)
void displayQueue(){
cout<<"\n\tfront:"<<front<<"\t"<<"back:"<<back<<"\tcount:"<<count<<“\tmax:”<<max<<"\n";
if(count == 0){
}else{
cout<<"\t"<<queue[i];
Continue…
Queue Implementation Using Array(Circular)
int main(){
int selection;
menu:
cout<<"\n1\tenQueue Circular\n";
cout<<"\n2\tdeQueue Circular\n";
cout<<"\n3\tDisplay Queue\n";
cout<<"\n\tSelection is:";
cin>>selection;
Continue…
Queue Implementation Using Array(Circular)
switch(selection){
case 1: enQueue();
displayQueue();
goto menu;
break;
case 2: deQueue();
displayQueue();
goto menu;
break;
case 3: displayQueue();
goto menu;
break;
Continue…
Queue Implementation Using Array(Circular)
default:cout<<"\n\tWrong Selection\n";
return 0;
}
4.0 Queue Implementation Using
Linked List(Linear)
Queue Implementation Using Linked List(Linear)
Pointer-Based Implementation
• More straightforward than array-based
• Need Two external pointer (Front & Back) which front to
trace deQueue operation and back to trace deQueue
operation.
Create Queue Implementation Using Linked
List(Linear)
Example Code 1:
#include <iostream>
struct nodeQueue{
char name;
nodeQueue *next;
Compiler get the initial illustrated structure of node
};
Continue…
Create Queue Implementation Using Linked
List(Linear)
nodeQueue *back_ptr = NULL; NULL
NULL
front_ptr
Continue…
enQueue Implementation Using Linked
List(Linear)
void enQueue(){
0110
//create new node
cout<<"\n\t####enQueue####\n";
cout<<"Enter Name:";
cin>>newnode->name;
cout<<"Enter Age:";
cin>>newnode->age;
newnode->next = NULL;
Continue…
enQueue Implementation Using Linked
List(Linear)
//insert newnode into queue
Insertion to an empty queue
//check whether queue is empty
Continue…
enQueue Implementation Using Linked
List(Linear)
Insertion to a non empty queue
0111
0110
front_ptr back_ptr
name age next
back_ptr->next = newnode;
back_ptr=newnode;
Continue…
enQueue Implementation Using Linked
List(Linear)
Insertion to a non empty queue
0110 0111
front_ptr back_ptr
name age next name age next
Continue…
deQueue Implementation Using Linked List(Linear)
Continue…
void deQueue(){
cout<<"\n\t####deQueue####\n";
cout<<"\n\tQueue Is Empty!!!\n";
}else{
nodeQueue *temp;
temp = front_ptr;
if(front_ptr->next == NULL){
front_ptr = NULL;
delete temp;
}else{
front_ptr = front_ptr->next;
delete temp; } } }
Continue…
deQueue Implementation Using Linked List(Linear)
If the queue contains one item only to be deleted
nodeQueue *temp;
temp = front_ptr;
0110
0110
if(front_ptr->next == NULL){
temp front_ptr = NULL;
NULL NULL
back_ptr = NULL;
front_ptr back_ptr
delete temp;
}else{
…}
Continue…
deQueue Implementation Using Linked
List(Linear)
If the queue contains more than one item
nodeQueue *temp;
temp = front_ptr;
0110 0111
0110 Ali 29 0111 Tina 30 NULL 0111
front_ptr name age next name age next back_ptr
0110
temp
Continue…
…}else{
front_ptr = front_ptr->next;
delete temp; }
0110 0111
0111 Ali 29 0111 Tina 30 NULL 0111
front_ptr name age next name age next back_ptr
0110
temp
0111
0111 Tina 30 NULL 0111
front_ptr name age next back_ptr
Continue…
displayQueue Implementation Using Linked
List(Linear)
void displayQueue(){
cout<<"\n\t####Display Queue####\n";
if((front_ptr == NULL) && (back_ptr == NULL)){
cout<<"\n\tQueue Is Empty!!!\n";
cout<<"\n\tfront_ptr :"<<front_ptr<<"\tback_ptr :"<<back_ptr<<endl;
}else{
nodeQueue *cursor;
cursor=front_ptr;
cout<<"\n\tThe Elements In Queue Are\n";
cout<<"\n\tfront_ptr :"<<front_ptr<<"\tback_ptr :"<<back_ptr<<endl;
int node=1;
while(cursor){
cout<<"\n\tNode :"<<node++<<"\tName :"<<cursor->name<<"\tAge :"<<cursor-
>age<<"\tcursor-next:"<<cursor->next<<endl;
cursor=cursor->next; } } Continue…
Queue Implementation Using Linked List(Linear)
int main()
{
int selection;
menu:
cout<<"\n\nMenu Selection\n";
cout<<"\n1\tenQueue\n";
cout<<"\n2\tdeQueue\n";
cout<<"\n3\tDisplay Queue\n";
cout<<"\n\tSelection is:";
cin>>selection;
Continue…
Queue Implementation Using Linked List(Linear)
switch(selection){
case 1: enQueue();
displayQueue();
goto menu;
break;
case 2: deQueue();
displayQueue();
goto menu;
break;
case 3: displayQueue();
goto menu;
break;
default:cout<<"\n\tWrong Selection\n"; }
return 0;
}
Continue…