Download presentation

Presentation is loading. Please wait.

Published byStacey Deagle Modified about 1 year ago

1
Queue Definition Ordered list with property: –All insertions take place at one end (tail) –All deletions take place at other end (head) Queue: Q = (a 0, a 1, …, a n-1 ) a0 is the front element, a n-1 is the tail, and a i is behind a i-1 for all i, 1 <= i < n

2
Queue Definition Because of insertion and deletion properties, Queue is very similar to: Line at the grocery store Cars in traffic Network packets …. Also called first-in first out lists

3
Array-Based Queue Definition template class Queue { public: Queue(int MaxQueueSize = DefaultSize); ~Queue(); bool IsFull(); bool IsEmpty(); void Add(const KeyType& item); KeyType* Delete(KeyType& item); private: void QueueFull(); // error handling void QueueEmpty();// error handling int head, tail; KeyType* queue; int MaxSize; };

4
Queue Implementation Constructor: template Queue ::Queue(int MaxQueueSize): MaxSize(MaxQueueSize) { queue = new KeyType[MaxSize]; head = tail = -1; }

5
Queue Implementation Destructor: template Queue ::~Queue() { delete [] queue; head = tail = -1; }

6
Queue Implementation IsFull() and IsEmpty(): template bool Queue ::IsFull() { return (tail == (MaxSize-1)); } template bool Queue ::IsEmpty() { return (head == tail); }

7
Queue Implementation Add() and Delete(): template void Queue ::Add (const KeyType& item) { if (IsFull()) {QueueFull(); return;} else { tail = tail + 1; queue[tail] = item; } } template KeyType* Queue ::Delete(KeyType& item) { if (IsEmpty()) {QueueEmpty(); return 0}; else { head = head + 1; item = queue[head]; return &item; } }

8
Example: OS Job Scheduling OS has to manage how jobs (programs) are executed on the processor – 2 typical techniques: -Priority based: Some ordering over of jobs based on importance (Professor X’s jobs should be allowed to run first over Professor Y). -Queue based: Equal priority, schedule in first in first out order.

9
Queue Based Job Processing FrontRearQ[0] Q[1] Q[2] Q[3]Comments Initial 0 J1Job 1 Enters 1 J1 J2Job 2 Enters 2 J1 J2 J3Job 3 Enters 02 J2 J3Job 1 Leaves 03 J2 J3 J4Job 4 Enters 13 J3 J4Job 2 Leaves

10
Job Processing When J4 enters the queue, rear is updated to 3. When rear is 3 in a 4-entry queue, run out of space. The array may not really be full though, if head is not -1. Head can be > -1 if items have been removed from queue. Possible Solution: When rear = (maxSize – 1) attempt to shift data forwards into empty spaces and then do Add.

11
Queue Shift private void shiftQueue(KeyType* queue, int & head, int & tail) { int difference = head – (-1); // head + 1 for (int j = head + 1; j < maxSize; j++) { queue[j-difference] = queue[j]; } head = -1; tail = tail – difference; }

12
Queue Shift Worst Case For Queue Shift: Full Queue Alternating Delete and Add statements FrontRearQ[0] Q[1] Q[2] Q[3]Comments 3 J1 J2 J3 J4Initial 03 J2 J3 J4Job 1 Leaves 3 J2 J3 J4 J5Job 5 Enters 03 J3 J4 J5Job 2 Enters 3 J3 J4 J5 J6Job 6 Leaves

13
Worst Case Queue Shift Worst Case: –Shift entire queue: Cost of O(n-1) –Do every time perform an add –Too expensive to be useful Worst case is not that unlikely, so this suggests finding an alternative implementation.

14
‘Circular’ Array Implementation Basic Idea: Allow the queue to wrap-around Implement with addition mod size: tail = (tail + 1) % queueSize; 0 1 2 3 4 N-1 N-2 J1 J2 J3 J4 0 1 2 3 4 N-1 N-2 J2 J3 J1

15
Linked Queues Problems with implementing queues on top of arrays –Sizing problems (bounds, clumsy resizing, …) –Non-circular Array – Data movement problem Now that have the concepts of list nodes, can take advantage of to represent queues. Need to determine appropriate way of: –Representing front and rear –Facilitating node addition and deletion at the ends.

16
Linked Queues CAT Front Rear MATHAT FrontRear Add(Hat) Add(Mat) Add(Cat)Delete()

17
Linked Queues Class QueueNode{ friend class Queue; public: QueueNode(int d, QueueNode * l); private: int data; QueueNode *link; };

18
Linked Queues class Queue { public: Queue(); ~Queue(); void Add(const int); int* Delete(int&); bool isEmpty(); private: QueueNode* front; QueueNode* rear; void QueueEmpty(); }

19
Linked Queues Queue::Queue() { front = 0; rear = 0; } bool Queue::isEmpty() { return (front == 0); } Front Rear 0 0

20
Linked Queues void Queue::Add(const int y) { // Create a new node that contains data y // Has to go at end // Set current rear link to new node pointer // Set new rear pointer to new node pointer rear = rear->link = new QueueNode(y, 0); } CAT Front MAT HAT Rear

21
Linked Queues int * Queue::Delete(int & retValue) { // handle empty case if (isEmpty()) {return 0;} QueueNode* toDelete = front; retValue = toDelete.data; front = toDelete->link; delete toDelete; return &retValue; } CAT Front MAT HAT ReartoDelete HAT returnValue Front

22
Queue Destructor Queue destructor needs to remove all nodes from head to tail. CAT Front MAT HAT RearFront Temp 0 0 if (front) { QueueNode* temp; while (front != rear) { temp = front; front = front -> link; delete temp; } delete front; front = rear = 0; }

23
Front vs Delete Implementation as written has to remove the item from the queue to read data value. Some implementations provide two separate functions: –Front() which returns the data in the first element –Delete() which removes the first element from the queue, without returning a value.

24
Radix Sort and Queues What does radix sort have to do with queues? Each list (the master list (all items) and bins (per digit)) needs to be first in, first out ordered – perfect for a queue.

Similar presentations

© 2017 SlidePlayer.com Inc.

All rights reserved.

Ads by Google