Post on 27-Dec-2015
Queues
CSI 1101N. El Kadri
2
Definitions• A queue is a linear abstract data type such that
insertions are made at one end, called the rear, and removals are made at the other end, called the front.
• Queues are sometimes called FIFOs: first-in first-out.enqueue() Queue dequeue()
The two basic operations are:• enqueue: adds an element to the rear of the queue.• dequeue: removes and returns the element at the
front of the queue.
Software queues are similar to physical ones: queuing at the supermarket, at the bank, at cinemas, etc.
3
Applications
• Shared resources management(system programming):– Access to the processor;– Access to the peripherals such as disks
and printers.
• Application programs:– Simulations;– Generating sequences of increasing
length over a finite size alphabet;– Navigating through a maze.
4
Example
class Simple {public static void main( String[] args ) {
Queue queue = new QueueImplementation(); for ( int i=0; i<10; i++ )
queue.enqueue( new Integer( i ) ); while ( ! queue.isEmpty() )
System.out.println( queue.dequeue() ); }
}
What does it print?
5
q = new QueueImpl() q []q.enqueue(a) q [a]q.enqueue(b) q [a,b]q.enqueue(c) q [a,b,c]q.enqueue(d) q [a,b,c,d]q.dequeue() a q [b,c,d]q.dequeue() b q [c,d]q.enqueue(e) q [c,d,e]q.dequeue() c q [d,e]q.dequeue() d q [e]
Elements of a queue are processed in the same order as the they are inserted into the queue, here “a” was the first element to join the queue and it was the first to leave the queue: first-come first-serve.
6
Implementations
• Just like stacks, there are two families of implementations.– Array-based;– Linked-structure.
7
Today’s Topics
• Queue– Implementation of Queue– Usage of Queue
8
Queue• Queue: First In First Out (FIFO)
• Toll Station– Car comes, pays, leaves
• Check-out in Big Y market– Customer comes, checks out and leaves
• More examples: Printer, Office Hours, …
ABCD OutputInput
9
More Examples of Queue
• In our daily life– Airport Security Check– Cinema Ticket Office– Bank, ATM– Anything else ?
10
What Is Queue
• Queue is an abstract data type• Adding an entry at the rear • Deleting an entry at the front
frontfrontrearrear
AddingAdding DeletingDeletingABC
11
Abstract Data Types
• Queue– Operating on both ends– Operations: EnQueue(in),
DeQueue(out)
frontfrontrearrear
enqueueenqueuedequeuedequeue
ABC
12
QueueQueue is FIFO ( First-In First-Out)
A queue is open at two ends. You can only add entry (enqueue) at the rear , and delete entry (dequeue) at the front.
Note that you cannot add/extract entry in the middle of the queue.
13
Applications of Queue
• Printing Job Management• Packet Forwarding in Routers• Message queue in Windows• I/O buffer
14
Printing Job Management
• Many users send their printing jobs to a public printer
• Printer will put them into a queue according to the arrival time and print the jobs one by one
• These printing documents are A.doc, B.doc, C.doc and D.doc
15
Printing Queue
Now printing A.doc
A.doc is finished. Now printing B.doc
Now still printing B.docD.doc comes
• A.doc B.doc C.doc arrive to printer.ABC
BC
BCD
CD
D
B.doc is finished. Now printing C.doc
C.doc is finished. Now printing D.doc
16
First-in First-out (FIFO)
When we enqueue entries in the queue and then dequeue them one by one, we will get the items in the same order.
When we enqueue entries in the queue and then dequeue them one by one, we will get the items in the same order.
The first one enqueued is the first one dequeued. (FIFO)
The first one enqueued is the first one dequeued. (FIFO)
ABC
A
AB
BC
C
A, B, C come in
A, B, C come out
17
Question
• Queue is an abstract data structure
• Item can be Integer, Double, String, Employee, Faculty…
• How to implement a general queue for all those types?
18
Abstract Data Type
• Same as Stack, we use Object data type instead of int or double or String or other data type
• Use an array in queue, which stores all items come in.– Object Queue[ ];
• Other implementations are possible
19
Array Implementation of Queue
B AD C
Max_Size rear front
After A leaves,
BD C
Max_Size rear front
1 0n-1 3 2
1 0n-1 3 2
20
Operations• enqueue
– add a new item at the rear
• dequeue– remove a item from the front
• isEmpty– check whether the queue is empty or not
• isFull– check whether the queue is full or not
• size– return the number of items in the queue
• peek– return the front item
21
Problem
• An array has limited size, once rear is at the end of this array, and there is new item coming in, what can we do?
Y X ……1 0n-1 3 2
rear front
22
Two Solutions
• Shifting all items to front in the array when dequeue operation. ( Too Costly… )
• Wrapped around array ---- Circular Array
B A …… C1 0n-1 3 2
rear=3 front=0
C B ……1 0n-1 3 2
rear=2 front=0
A leaves
23
Circular Array
• Wrapped around array
B A …… C1 0n-1 3 2
rear=3 front=0
A
BC
0
23
n-1
1
rear=3
front=0
24
EnQueue & DeQueue In Circular Array
• EnQueue– rear = (rear + 1) MOD n
• DeQueue– front = (front + 1) MOD n
A
BC
0
23
n-1
1
rear=3
BC
0
23
n-1
1
front=1
25
Empty/Full In Circular Array• When rear equals front, Queue is
empty• When (rear + 1) MOD n equals
front, Queue is full• Circular array with capacity n at
most can hold n-1 items.
26
Implementation for Queue
public class ArrayQueuePT {
private final static int DEFAULT_CAPACITY = 100;// suppose the default capacity for this queue is 100.
private Object queue[ ];
// The array that holds the items
private int rear, front;
// Index of rear, front item in the queue;
}
27
ArrayQueuePT Constructor// Creates a queue with the default capacitypublic ArrayQueuePT () {
this(DEFAULT_CAPACITY);}// Creates a queue with a user-specified capacitypublic ArrayQueuePT (int capacity) {
if (capacity < 2)throw new IllegalArgumentException ("Capacity
must be > 1");queue = new Object[capacity];rear = front = 0;
}
28
ArrayQueuePT --- Size()
• How many items currently in the queue?
public int size() {
if( rear >= front )
return rear – front;
else
return queue.length + rear – front;
}
29
ArrayQueuePT --- isEmpty/isFull// check whether the queue is emptypublic boolean isEmpty() {
return rear == front;}// check whether the queue is fullpublic boolean isFull() {
return size() == queue.length-1;}
30
ArrayQueuePT --- enqueue()
public void enqueue(Object item) {if (item == null)
throw new IllegalArgumentException ("Item is null");if (isFull())
throw new IllegalStateException (“Queue is full");
queue[rear] = item; rear = (rear + 1)%queue.length;}
31
ArrayQueuePT --- dequeue()public Object pop( ) {
if (isEmpty())throw new IllegalStateException (“Queue
is empty");Object frontItem = queue[front];
queue[front] = null; front = (front + 1)%queue.length; return frontItem;}
32
ArrayQueuePT -- peek()
public Object peek() {
if (isEmpty())
throw new IllegalStateException (“Queue is empty");
return queue[front];
}
33
Interface
• Users don’t need to know how Queue is implemented.
• User only need to know how they can operate the Queue.
• There are many ways to implement Queue, but all of them have the same interfaces– enqueue, dequeue, peek, isFull,
isEmpty
34
Interface and Implementation Class• Interface contains a skeleton for public
operations– No real code for each method– Like function prototype
• A class implements interface– Implements every method
• Statement:public class myclass implements interface {
… …}
35
Interface for Queue
public interface QueuePT { public boolean isEmpty(); public boolean isFull(); public Object peek(); public Object dequeue(); public void enqueue(Object item); public int size();}
36
Implementation of ArrayQueuePT Class
• Example: QueuePT.java, ArrayQueuePT.java
public class ArrayQueuePT implements QueuePT {
private final static int DEFAULT_CAPACITY = 100;
private Object queue[]; // The array holds the queue
private int rear, front;
// Index of rear, front items in queue
37
Create an object of ArrayQueuePT// create a queue with default capacityQueuePT myqueue = new ArrayQueuePT();
// create a queue with 1024 elementsQueuePT registry = new
ArrayQueuePT(1024);
38
Using ArrayQueuePT
• enqueue and dequeue characters in Queue myque– myque.enqueue( new Character(‘a’) )– char ch = ((Character)myque.dequeue()).charValue()
• enqueue and dequeue Employee in Queue registry– registry.enqueue( new Employee(“Hamad”,
“5456”) )– Employee emp = (Employee) registry.dequeue();
39
Printing Job Management4 documents are ready to print• Print the printer status
– new document comes– which document is finished
• Using ArrayQueuePT
• Complete Example: – PrintingJobQueue.java
40
New Printing Jobs comepublic void printstatus() { QueuePT que = new ArrayQueuePT( ); //Create a
new queue System.out.println("Printing job: Null "); //print the
printer status // new printing jobs come, a.doc, b.doc, c.doc,
d.doc System.out.println("New printing job: a.doc"); que.enqueue( "a.doc" ); System.out.println("New printing job: b.doc"); que.enqueue( "b.doc" ); System.out.println("New printing job: c.doc"); que.enqueue( "c.doc" ); System.out.println("New printing job: d.doc"); que.enqueue( "d.doc" );
41
Finishing Printing Jobs
// print the printer status
System.out.println("\nPrinting job: there are " + que.size() + " jobs in the queue");
System.out.println(" " + que.dequeue() + " is Finished");
System.out.println(" " + que.dequeue() + " is Finished");
System.out.println(" " + que.dequeue() + " is Finished");
System.out.println(" " + que.dequeue() + " is Finished");
}
42
Customer Service In Royal Bank• Suppose there is only one customer service
available in Royal Bank on Saturday morning• In every 3 minutes, a new customer arrives
at the end of waiting line• Each customer will need 5 minutes for the
service • Print out the information after the first 30
minutes– The time of arriving and leaving for each customer– How many customers are in the line?– Who is the current serving customer?
43
Customer Service Queue• Complete example:
BankServiceQueue.javapublic void run( ) {
// Create a new queue QueuePT que = new ArrayQueuePT(100);
int time = 0; // in minutes int incustomer = 0; // secquence of
customers int servicetime = 0; // service times
44
Customer In Service// what's going on in 30 minutes
while ( time <= 30 ) { // if queue is not empty, one customer service is working
if( que.size()!=0 ) { servicetime = servicetime + 1; // customer leaves when finishing the service, the service time is
5 minutes
if( servicetime == 5 ) { String name = (String)que.dequeue(); System.out.println("<< " + name + " leaves at time = " +
time); // start to service time for next customer
servicetime = 0; } }
45
New Customer Comes // every 3 minutes, there is a new customer
coming. if( time%3==0 ) { incustomer = incustomer + 1; String name = "CUSTOMER " + incustomer; que.enqueue( name ); System.out.println(">> " + name + "
arrives at time = " + time); } time = time + 1;}
46
Print Status After 30 Minutes // print the status after 30 minutes System.out.println("\
n==========================" ); if( que.size()!=0 ) { System.out.println("There are " + que.size() + "
customers in the line" ); System.out.println("The current serving customer
is " + que.peek() ); } else { System.out.println("There are no customers in the
line" ); }}
47
Priority Queue --- Air Travel• Only one check-in service in Air
Canada at airport• Two waiting lines for passengers
– one is First class service– the other is Economy class service
• Passengers in the first-class waiting line have higher priority to check in than those in the economy-class waiting line.
48
Priority Queue
• Two queues– one is high priority queue– the other is low priority queue
• Service rules:– First serve the people in high priority
queue– If no passengers are in high priority
queue, serve the passengers in low priority queue
49
Two Queues• High Priority Queue, will come in hpQue• Low Priority Queue, will come in lpQue
D CHCheck In
G F E B A
High Priority Queue
Low Priority Queue
Customers coming in
50
Pseudocode For Arrival
Passengers Arrival: if( new Passenger comes ) { if( is First Class) hpQue.enqueue( new
Passenger ); else lpQue.enqueue( new
Passenger ); }
51
Pseudocode For Service
Check-In Service: if( hpQue is not empty ) {
serve the passenger from high priority queue,
hpQue.dequeue();
}
else {
serve the passenger from low priority queue,
lpQue.dequeue();
}