CSCE 210 Data Structures and Algorithms Prof. Amr Goneid AUC Part 2b. Simple Containers: The Queue Prof. Amr Goneid, AUC
The Queue ADT Introduction to the Queue data structure Array Models Array Based Queue ADT Linked Queues Simulation of a Waiting Line Prof. Amr Goneid, AUC
1. introduction to the Queue Data Structure A simple data container consisting of a linear list of elements Access is by position (order of insertion) Insertions at one end (rear) , deletions at another end (front) First In First Out (FIFO) structure Two basic operations: enqueue: add to rear, complexity is O(1) dequeue: remove from front, complexity is O(1) Prof. Amr Goneid, AUC
An Illustration Prof. Amr Goneid, AUC
Demo Queue Animation Prof. Amr Goneid, AUC
Some Queue Applications Simulation of waiting lines Simulation of serviceable events Job scheduling Input/Output Buffering Multiprogramming Prof. Amr Goneid, AUC
2. Array Models Model 1: Variable Front and Rear Problem: Not possible to enqueue although there is space. n-1 Q F R Dequeue Enqueue Prof. Amr Goneid, AUC
Array Models Model 2: Fixed Front, variable Rear Problem: To empty a queue of n elements we have to shift the elements to the left each time we dequeue. Total number of shifts = (n-1) + (n-2) + …..+ 2 + 1 = n(n-1)/2 = O(n2) Too Expensive n-1 Q Dequeue Prof. Amr Goneid, AUC
Array Models Model 3: Ring Model No need to do any shifts ! The queue is viewed as a circular array When last array element is reached, we move back to start To enqueue: rear = (rear + 1) % size To dequeue: front = (front + 1) % size Both rear and front advance clockwise Keep a count of the number of elements in the queue Initially, the queue is empty: front = 1 rear = 0 count = 0 No need to do any shifts ! Prof. Amr Goneid, AUC
The queue may be implemented as a dynamic array. 3. Array Based Queue ADT The queue may be implemented as a dynamic array. The capacity (MaxSize) will be input as a parameter to the constructor (default is 128) The queue ADT will be implemented as a template class to allow for different element types. Prof. Amr Goneid, AUC
Queue Class Operations construct: construct an empty queue queueIsEmpty bool : return True if queue is empty queueIsFull bool : return True if queue is full enqueue(el) : add element (el) at the rear dequeue(el): retrieve and remove the front element queueFront(el): retrieve front without removing it queueRear(el): retrieve rear without removing it queueLength int : return the current queue length Prof. Amr Goneid, AUC
A Queue Class Definition // File: Queuet.h // Queue template class definition // Dynamic array implementation #ifndef QUEUET_H #define QUEUET_H template <class Type> class Queuet { public: Queuet (int nelements = 128); // Constructor ~Queuet (); // Destructor Prof. Amr Goneid, AUC
A Queue Class Definition // Member Functions void enqueue(Type ); // Add to rear void dequeue(Type &); // Remove from front void queueFront(Type &) const; // Retrieve front void queueRear(Type &) const; // Retrieve rear bool queueIsEmpty() const; // Test for Empty queue bool queueIsFull() const; // Test for Full queue int queueLength() const; // Queue Length private: Type *queue; // pointer to dynamic array int front, rear, count, MaxSize; }; #endif // QUEUET_H #include "Queuet.cpp" Prof. Amr Goneid, AUC
A Queue Class Implementation // File: Queuet.cpp // Queue template class implementation #include <iostream> using namespace std; // Constructor with argument, size is nelements, default is 128 template <class Type> Queuet<Type>::Queuet(int nelements) { MaxSize = nelements; queue = new Type[MaxSize]; front = 1; rear = 0; count = 0; } Prof. Amr Goneid, AUC
A Queue Class Implementation Implement the other member functions as in: http://www1.aucegypt.edu/faculty/cse/goneid/csci210/210 CE2.pdf Prof. Amr Goneid, AUC
A Driver Program to Test Class // File: QueuetAppl.cpp // Test if a string is a palindrome #include <iostream> #include <string> using namespace std; #include "Stackt.h" #include "Queuet.h" bool palindrome(string w); Prof. Amr Goneid, AUC
A Driver Program to Test Class int main() { string w; cout << "Enter a string:" << endl; getline(cin,w); cout << w << endl; if (palindrome(w)) cout << "Palindrome" << endl; else cout << "NOT Palindrome" << endl; return 0; } Prof. Amr Goneid, AUC
A Driver Program to Test Class bool palindrome(string w) { Stackt<char> s; Queuet<char> q; int L = w.length(); char c,v; for (int i = 0; i < L; i++) { c = w.at(i); s.push(c); q.enqueue(c); } while(!q.queueIsEmpty()) { q.dequeue(c); s.pop(v); if(c != v) return false; } return true; } Prof. Amr Goneid, AUC
A Driver Program to Test Class Output: Enter a string: 12321 Palindrome Press any key to continue 123456 NOT Palindrome Prof. Amr Goneid, AUC
4. Linked Queues A Queue can be implemented as a linked structure. Requires more space than array implementations, but more flexible in size. Two pointers are needed: front for dequeue and rear for enqueue Prof. Amr Goneid, AUC
Node Specification // The linked structure for a node can be // specified as a Class in the private part of // the main queue class. class node // Hidden from user { public: Type e; // stack element node *next; // pointer to next node }; // end of class node declaration typedef node * NodePointer; NodePointer front , rear; // pointers Prof. Amr Goneid, AUC
Enqueue Operation 3 2 1 pnew rear front New enqueue(v): NodePointer pnew = new node; pnew->e = v; pnew->next = NULL; rear->next = pnew; rear = pnew; 1 pnew Prof. Amr Goneid, AUC
Dequeue Operation 1 rear cursor front 3 2 dequeue(v): v = front->e; front = front->next; delete cursor; Prof. Amr Goneid, AUC
Linked Queue Class // File: QueueL.h // Linked List Queue class definition #ifndef QUEUEL_H #define QUEUEL_H template <class Type> class QueueL { public: QueueL(); // Constructor ~QueueL(); // Destructor void enqueue(Type ); // Add to rear Prof. Amr Goneid, AUC
Linked Queue Class void dequeue(Type &); // Remove from front void queueFront(Type &) const; // retrieve front bool queueIsEmpty() const; // Test for Empty queue int queueLength() const; // Queue Length private: // Node Class class node { public: Type e; // queue element node *next; // pointer to next node }; // end of class node declaration Prof. Amr Goneid, AUC
Linked Queue Class typedef node * NodePointer; NodePointer front , rear; // Pointers int count; // length }; #endif // QUEUEL_H #include "QueueL.cpp" Prof. Amr Goneid, AUC
5. Simulation of a Waiting Line Queues can simulate waiting lines A waiting line is a queue of jobs waiting to be served by a server on FCFS (First Come First Serve) basis. Prof. Amr Goneid, AUC
Simulation of a Waiting Line Time of arrival of a job is essentially random, but with a fixed probability per unit time. A clock registers arrival time, the simulation is Time-Driven Simulation tries to answer the question: What happens if… Prof. Amr Goneid, AUC
Simulation of a Waiting Line Notations: Tmax Maximum Simulation Time (fixed) t Clock Time = current time (0 ≤ t < Tmax) <Ta > Average time between two arrivals (fixed) Pa Probability of arrival per unit time = 1/ <Ta > Ts Service time (fixed) Tr Time remaining to start service ta Arrival time (random) Tw Wait time = t - ta Prof. Amr Goneid, AUC
Simulation of a Waiting Line Clock (t) Tw Tmax 1 2 3 ta t Service Starts Arrival ta ta dequeue enqueue Prof. Amr Goneid, AUC
Simulation of a Waiting Line Algorithm Set Tmax , <Ta> , Ts and compute Pa = 1/<Ta> Initialize waiting line and clock t = 0 set Tr = 0 while (t < Tmax) { Test for arrival. If job arrived, process arrival. Test for server ready. If ready, exit line and start service. If (Tr > 0) decrement Tr Increment clock time t } Compute average wait time Prof. Amr Goneid, AUC
Simulation of a Waiting Line Test for Arrival & Arrival Processing arrival (Q) { Generate Random number (R) between 0 and 1.0 if ( R < Pa ) // job arrived if (Q.queueIsFull()) report error: Line is full else { ta = t ; Q.enqueue (ta); } } Prof. Amr Goneid, AUC
Simulation of a Waiting Line Test for server ready. If ready, exit line and start service. if((Tr is 0) and (not Q.queueIsEmpty())) { exitLine; start service (set Tr = Ts); } Prof. Amr Goneid, AUC
Simulation of a Waiting Line Exit Line exitLine (Q) { if ( Q.queueIsEmpty()) Report: Line is Empty else Q.dequeue (ta); Tw = t – ta; // wait time waitTotal = waitTotal + Tw; // Total wait time jobcount = jobcount + 1; // jobs serviced } Prof. Amr Goneid, AUC
Simulation of a Waiting Line Compute average wait time averagewait (Q) { if ( jobcount is 0) return 0; else return (waitTotal / jobcount); } Prof. Amr Goneid, AUC
Simulation of a Waiting Line Arrival# 5 at: 31 Job# 4 Service Started at: 33 wait = 9 Job# 5 Service Started at: 39 wait = 8 Arrival# 6 at: 46 Job# 6 Service Started at: 46 wait = 0 Arrival# 7 at: 48 Arrival# 8 at: 50 Arrival# 9 at: 52 Job# 7 Service Started at: 52 wait = 4 Job# 8 Service Started at: 58 wait = 8 Arrival# 10 at: 64 Job# 9 Service Started at: 64 wait = 12 ............... Arrival# 28 at: 278 Job# 28 Service Started at: 278 wait = 0 Average wait Time is 2.89286 A possible tracing of the simulation program Prof. Amr Goneid, AUC
Learn on your own about: Using Queues in buffering and scheduling The Deque (Double-Ended Queue) container Prof. Amr Goneid, AUC