0% found this document useful (0 votes)
36 views73 pages

Chapter 4 - QUEUE Ver2

The document discusses queue concepts and implementation using arrays. It defines queues as first-in, first-out data structures where new items are added to the rear and items are removed from the front. Key operations are enqueue to add an item to the rear, and dequeue to remove an item from the front. The document provides pseudocode to implement queues using arrays, including maintaining separate front and rear indexes and wrapping around to the beginning of the array when the queue is full or empty.

Uploaded by

ameeramzar85
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
36 views73 pages

Chapter 4 - QUEUE Ver2

The document discusses queue concepts and implementation using arrays. It defines queues as first-in, first-out data structures where new items are added to the rear and items are removed from the front. Key operations are enqueue to add an item to the rear, and dequeue to remove an item from the front. The document provides pseudocode to implement queues using arrays, including maintaining separate front and rear indexes and wrapping around to the beginning of the array when the queue is full or empty.

Uploaded by

ameeramzar85
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 73

QUEUE

Course Objectives

At the end of the lesson students are expected to be able


to:

• Understand queue concepts and applications.

• Understand queue structure and operations that can be


done on queue.

• Understand and know how to implement queue using


array and linked list : linear array, circular array, linear
link list and circular list.
1.0 Introduction to Queue
Introduction to Queue

• New items enter at the back, or rear, of the

queue

• Items leave from the front of the queue

• First-in, first-out (FIFO) property

– The first item inserted into a queue is the

first item to leave

– Middle elements are logically inaccessible


Introduction to Queue

• Important in simulation & analyzing the

behavior of complex systems


Queue Applications

• Real-World Applications
– Cashier lines in any store

– Check out at a bookstore

– Bank / ATM

– Call an airline
Queue Applications

• Computer Science Applications


– Print lines of a document

– Printer sharing between computers

– Recognizing palindromes

– Shared resource usage (CPU, memory


access, …)
Queue Applications

• 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

Basic Structure of a Queue:


•Data structure that hold the queue
•head
•rear
Queue implementation

Add/
A B C D Enqueue

Head Rear

Insert D into Queue (enQueue) : D is inserted at rear


Remove/
Dequeue A B C D

Head Rear

Delete from Queue (deQueue) : A is removed


Queue operations
• Queue operations

– Create an empty queue

– Destroy a queue

– Determine whether a queue is full

– Add a new item to the queue (enQueue)

– Determine whether a queue is empty

– Remove the item that was added earliest(deQueue)

– Retrieve at Front(getFront)

– Retrieve at Back the item that was added


earliest(getRear)
Queue Implementation

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.

• Need isFull() operation to determine


whether a queue is full or not.
Queue Implementation Using
Array(Linear)

• Queue structure need at least 3 elements:

1) Element to store items in Queue

2) Element to store index at head

3) Element to store index at rear


Create Queue Operation

• Declare

– front & rear are indexes in the array

– Initial condition: front =0 & rear = -1

– Size of an array in queue


Queue
0 0 1 2 3 Max size -1
front rear
Create Queue operation
Example Code 1

#include <iostream>
using namespace std;
#define max 5

int front = 0, back = -1;


Create Queue
char item[max], newitem;

item

0 0 1 2 3 4 -1
front back

Front refer to index 0

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

Front refer to index 1


item
1 0 1 2 3 4 4
front NULL B C D E back
back = 3 + 1
Front refer to index 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

Front refer to index 2 Continue…


deQueue operation

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

Front refer to index 3

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

itemdeleted = item[front] From front/head


front = 3 item[front] = NULL

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

Front refer to index 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

itemdeleted = item[front] From front/head


front = 4 item[front] = NULL

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:

• After a sequence of additions & removals,


items will drift towards the end of the array

• enQueue operation cannot be performed


on the queue below, since back = max – 1.
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
Queue Implementation Using Array(Linear)

• Rightward drifting solutions


– Shift array elements after each deletion
• Shifting dominates the cost of the
implementation
Queue Implementation Using Array(Linear)

– Use a circular array: When Front or Back


reach the end of the array, wrap them around
to the beginning of the array
• Problem:
– Front & Back can't be used to
distinguish between queue-full & queue-
empty conditions
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.

• Need isFull() operation to determine


whether a queue is full or not.
Queue Implementation Using
Array(Circular)

• Queue structure need at least 3 elements:

1) Element to store items in Queue

2) Element to store index at head

3) Element to store index at rear

4) Element to store index in counter


Create Queue Operation
• Declare

– front & back are indexes in the array

– count to store index

– Initial condition: front =0 , back = -1, count = 0

– Size of an array in queue


Queue Implementation Using Array(Circular)

– The Wrap-around effect is obtained by using


modulo arithmetic (%-operator)
front = 0

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:

#include <iostream> queue


front = 0
using namespace std;
7 0

6 1
#define max 8

char queue[max], newitem;


5 2
int front = 0, back = -1, count = 0;
4 3

back = -1 count = 0

Continue…
Queue Implementation Using Array(Circular)
void enQueue(){

cout<<"\n\t#### enQueue Circular ####\n";

if(count == max){

cout<<"\n\tQueue Circular Is Full!!!\n";

}else{

cout<<"\n\tfront:"<<front<<"\t"<<"back:"<<back<<"\tcount:"<<count<<“\tmax:”<<max<<"\n";

cout<<"\n\tEnter Item:"; front = 0

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(){

cout<<"\n\t#### deQueue Circular ####\n";

if(count == 0){

cout<<"\n\tQueue Circular Is Empty, No Data To Be Deleted!!!\n";

}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\t#### Display Queue Circular ####\n";

cout<<"\n\tfront:"<<front<<"\t"<<"back:"<<back<<"\tcount:"<<count<<“\tmax:”<<max<<"\n";

if(count == 0){

cout<<"\n\tQueue Circular Is Empty, No Data To Be Display\n";

}else{

cout<<"\n\tItem In Queue Circular\n";

for(int i = 0; i < max; i++){

cout<<"\t"<<queue[i];

Continue…
Queue Implementation Using Array(Circular)
int main(){

int selection;

menu:

cout<<"\n\nPlease Choose Your Selection\n";

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>

using namespace std;

struct nodeQueue{

char name;

int age; name age next

nodeQueue *next;
Compiler get the initial illustrated structure of node
};

Continue…
Create Queue Implementation Using Linked
List(Linear)
nodeQueue *back_ptr = NULL; NULL

nodeQueue *front_ptr=NULL; back_ptr

NULL

front_ptr

Continue…
enQueue Implementation Using Linked
List(Linear)
void enQueue(){
0110
//create new node

nodeQueue *newnode; 0110 Ali 29 NULL

newnode = new nodeQueue; newnode

cout<<"\n\t####enQueue####\n";

//assign data field for name and age

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

if((front_ptr == NULL) && (back_ptr == NULL)){ 0110


front_ptr = newnode;
0110 Ali 29 NULL
back_ptr = newnode; newnode name age next
}else{
0110
0110
back_ptr->next = newnode; front_ptr
back_ptr
back_ptr = newnode;

Continue…
enQueue Implementation Using Linked
List(Linear)
Insertion to a non empty queue
0111

0111 Tina 30 NULL

newnode name age next

0110

0110 Ali 29 NULL 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

0110 Ali 29 0111 Tina 30 NULL 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";

//check whether queue is empty

if((front_ptr == NULL) && (back_ptr == NULL)){

cout<<"\n\tQueue Is Empty!!!\n";

}else{

nodeQueue *temp;

temp = front_ptr;

if(front_ptr->next == NULL){

front_ptr = NULL;

back_ptr = NULL; If the queue contains one item only

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 Ali 29 NULL 0110


front_ptr back_ptr
name age next

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…

You might also like