Title: Queues
1Queues
2Definitions
- 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.
3Applications
- 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.
4Example
- class Simple
- public static void main( String args )
- Queue queue new QueueImplementation()
- for ( int i0 ilt10 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.
6Implementations
- Just like stacks, there are two families of
implementations. - Array-based
- Linked-structure.
7Todays Topics
- Queue
- Implementation of Queue
- Usage of Queue
8Queue
- 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,
Output
Input
9More Examples of Queue
- In our daily life
- Airport Security Check
- Cinema Ticket Office
- Bank, ATM
- Anything else ?
10What Is Queue
- Queue is an abstract data type
- Adding an entry at the rear
- Deleting an entry at the front
11Abstract Data Types
- Queue
- Operating on both ends
- Operations EnQueue(in), DeQueue(out)
12Queue
- Queue 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.
13Applications of Queue
- Printing Job Management
- Packet Forwarding in Routers
- Message queue in Windows
- I/O buffer
14Printing 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
15Printing Queue
- A.doc B.doc C.doc arrive to printer.
Now printing A.doc
A.doc is finished. Now printing B.doc
Now still printing B.doc
D.doc comes
B.doc is finished. Now printing C.doc
C.doc is finished. Now printing D.doc
16First-in First-out (FIFO)
The first one enqueued is the first one dequeued.
(FIFO)
When we enqueue entries in the queue and then
dequeue them one by one, we will get the items in
the same order.
A, B, C come out
17Question
- Queue is an abstract data structure
- Item can be Integer, Double, String, Employee,
Faculty - How to implement a general queue for all those
types?
18Abstract 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
19Array Implementation of Queue
20Operations
- 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
21Problem
- 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?
1
0
n-1
3
2
Y
X
front
rear
22Two Solutions
- Shifting all items to front in the array when
dequeue operation. ( Too Costly ) - Wrapped around array ---- Circular Array
23Circular Array
24EnQueue DeQueue In Circular Array
- DeQueue
- front (front 1) MOD n
- EnQueue
- rear (rear 1) MOD n
25Empty/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.
26Implementation 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
27ArrayQueuePT Constructor
- // Creates a queue with the default capacity
- public ArrayQueuePT ()
- this(DEFAULT_CAPACITY)
-
- // Creates a queue with a user-specified capacity
- public ArrayQueuePT (int capacity)
- if (capacity lt 2)
- throw new IllegalArgumentException ("Capacity
must be gt 1") - queue new Objectcapacity
- rear front 0
28ArrayQueuePT --- Size()
- How many items currently in the queue?
- public int size()
- if( rear gt front )
- return rear front
- else
- return queue.length rear front
29ArrayQueuePT --- isEmpty/isFull
- // check whether the queue is empty
- public boolean isEmpty()
- return rear front
-
- // check whether the queue is full
- public boolean isFull()
- return size() queue.length-1
30ArrayQueuePT --- enqueue()
- public void enqueue(Object item)
- if (item null)
- throw new IllegalArgumentException ("Item is
null") - if (isFull())
- throw new IllegalStateException (Queue is
full") - queuerear item
- rear (rear 1)queue.length
31ArrayQueuePT --- dequeue()
- public Object pop( )
- if (isEmpty())
- throw new IllegalStateException (Queue is
empty") - Object frontItem queuefront
- queuefront null
- front (front 1)queue.length
- return frontItem
32ArrayQueuePT -- peek()
- public Object peek()
- if (isEmpty())
- throw new IllegalStateException (Queue is
empty") - return queuefront
33Interface
- Users dont need to know how Queue is
implemented. - Users 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
34Interface 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
-
35Interface 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()
36Implementation of ArrayQueuePT Class
- 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
37Create an object of ArrayQueuePT
- // create a queue with default capacity
- QueuePT myqueue new ArrayQueuePT()
- // create a queue with 1024 elements
- QueuePT registry new ArrayQueuePT(1024)
38Using 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(kyle, 5456) )
- Employee emp (Employee) registry.dequeue()
39Printing Job Management
- 4 documents are ready to print
- Print the printer status
- new document comes
- which document is finished
- Using ArrayQueuePT
40New Printing Jobs come
- public 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" )
41Finishing 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")
42Customer 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?
43Customer Service Queue
- public 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
44Customer In Service
- // what's going on in 30 minutes
- while ( time lt 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("ltlt " name
" leaves at time " time) - // start to service time for next
customer - servicetime 0
-
-
45New Customer Comes
- // every 3 minutes, there is a new customer
coming. - if( time30 )
-
- incustomer incustomer 1
- String name "CUSTOMER " incustomer
- que.enqueue( name )
- System.out.println("gtgt " name "
arrives at time " time) -
- time time 1
46Print 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" ) -
47Priority 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.
48Priority 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
49Two Queues
- High Priority Queue, will come in hpQue
- Low Priority Queue, will come in lpQue
High Priority Queue
Check In
Customers coming in
D
C
H
G
F
E
B
A
Low Priority Queue
50Pseudocode For Arrival
- Passengers Arrival
- if( new Passenger comes )
- if( is First Class)
- hpQue.enqueue( new Passenger )
- else
- lpQue.enqueue( new Passenger )
-
51Pseudocode 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()
-