queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out)...

38
1 COMP 250 Lecture 9 queue ADT Sept. 27/28, 2017

Transcript of queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out)...

Page 1: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

1

COMP 250

Lecture 9

queue ADT

Sept. 27/28, 2017

Page 2: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

ADT (abstract data type)

• Listadd(i,e), remove(i), get(i), set(i), …..

• Stackpush, pop(), ..

• Queueenqueue( e ), dequeue()

2

Page 3: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Queue

3

dequeue(remove fromfront) enqueue

(add at back)

Page 4: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Examples

• keyboard buffer

• printer jobs

• CPU processes (applications do not run in parallel)

• web server

• …….

4

Page 5: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

5

Stack

push(e)

pop()

LIFO(last in, first out)

Page 6: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

6

Stack

push(e)

pop()

LIFO(last in, first out)

Queue

enqueue( e )

dequeue()

FIFO(first in, first out)“first come, first serve”

Page 7: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

7

Exercise: Use stack(s) to implement a queue.

enqueue( e ){ // add element:

}

dequeue( ) { // remove ‘oldest’ element:

}

Write pseudocode for these two methods that uses a stack, namelyuse the operations push(e ) , pop(), isEmpty() .

Page 8: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Hint for Exercise

8

ihgfedcba

top

s tmpS

Use a second stack.

Page 9: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Hint for Exercise

9

ihgfedcba

top

s tmpS

while ( ! s.isEmpty() ){tmpS.push( s.pop( ) )

}

abcdefghi

s tmpS

Page 10: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Queue Example

enqueue( a )enqueue( b )dequeue( )

aabb

10

Page 11: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Queue Example

enqueue( a )enqueue( b )dequeue( )enqueue( c )enqueue( d )enqueue( e )dequeue( )enqueue( f )enqueue( g )

aabbbcbcdbcdecdecdefcdefg

11

Page 12: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

How to implement a queue?enqueue(e) dequeue()

singly linked list

doubly linked list

array list

12

Page 13: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

How to implement a queue?enqueue(e) dequeue()

singly linked list addLast(e) removeFirst()

doubly linked list (unnecessary)

array list

13

Page 14: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

How to implement a queue?enqueue(e) dequeue()

singly linked list addLast(e) removeFirst()

doubly linked list (unnecessary)

array list addLast(e) removeFirst()

SLOW

14

Page 15: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

15

length = 4

Implementing a queue with an array list. (BAD)

enqueue( a ) a---

enqueue( b ) ab--

dequeue( ) b--- Requires shift

0123indices0123

Page 16: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

16

length = 4

Implementing a queue with an array list. (BAD)

enqueue( a ) a---

enqueue( b ) ab--

dequeue( ) b---

enqueue( c ) bc--

enqueue( d ) bcd-

enqueue( e ) bcde

dequeue( ) cde-

Requires shift

Requires shift

0123indices0123

Page 17: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

17

length = 4

Implementing a queue with an array list. (BAD)

enqueue( a ) a---enqueue( b ) ab--dequeue( ) b---

enqueue( c ) bc--enqueue( d ) bcd-enqueue( e ) bcde

dequeue( ) cde-enqueue( f ) cdefenqueue( g ) cdefg---

0123indices

requires expansion

0123

Page 18: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

18

Use head and tail indices(tail = head + size – 1)

Implementing a queue with an expanding array.(also BAD)

enqueue( a ) a--- (0,0)enqueue( b ) ab-- (0,1)dequeue( ) -b-- (1,1)

enqueue( c ) -bc- (1,2)enqueue( d ) -bcd (1,3)enqueue( e ) ? --- (1,4)

dequeue( ) --cde--- (2,4)enqueue( f ) --cdef-- (2,5)enqueue( g ) --cdefg- (2,6)

Page 19: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

19

Use head and tail indices(tail = head + size – 1)

Implementing a queue with an expanding array.(also BAD)

enqueue( a ) a--- (0,0)enqueue( b ) ab-- (0,1)dequeue( ) -b-- (1,1)

enqueue( c ) -bc- (1,2)enqueue( d ) -bcd (1,3)enqueue( e ) -bcde--- (1,4)

dequeue( ) --cde--- (2,4)enqueue( f ) --cdef-- (2,5)enqueue( g ) --cdefg- (2,6)

Make biggerarray andcopy to it.

Page 20: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

20

An expanding array is an inefficient usage of space.

A better idea is….

Page 21: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Circular arraylength = 4 length = 8

0123 01234567

0123 01234567

0

12

3

4

5 6

7

01

2 3

Page 22: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

22

Circular arraytail = (head + size – 1) % length

head

tail

-bc-

head=1 tail=2

b

c

0123 01

2 3

enqueue( aenqueue( b )dequeue()enqueue( c )

Page 23: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

23

Circular arraytail = (head + size – 1) % length

head

taile-cd

c d

e

0123 01

2 3

tail=0 head=2

enqueue( a )enqueue( b )dequeue( )enqueue( c )enqueue( d )enqueue( e )dequeue()

Page 24: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

24

Circular arraytail = (head + size – 1) % length

e-cd

tail=0 head=2

0123

enqueue( element ){if (size < length)

queue[ (tail + 1) % length] = elementelse …. // coming upsize = size+1

}

dequeue(){ // check if empty omittedelement = queue[head]head = (head + 1) % lengthsize = size-1return element

}

Page 25: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

tail = (head + size – 1) % length

(head, tail, size)

enqueue( a ) a--- (0, 0, 1)

enqueue( b ) ab-- (0, 1, 2)

dequeue() -b-- (1, 1, 1)

enqueue( c ) -bc- (1, 2, 2)

enqueue( d ) -bcd (1, 3, 3)

enqueue( e ) ebcd (1, 0, 4)

dequeue() e-cd (2, 0, 3)

enqueue( f ) efcd (2, 1, 4)

array

Implementing a queue with a circular array (GOOD)

Page 26: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

tail = (head + size – 1) % length

(head, tail, size)

enqueue( a ) a--- (0, 0, 1)

enqueue( b ) ab-- (0, 1, 2)

dequeue() -b-- (1, 1, 1)

enqueue( c ) -bc- (1, 2, 2)

enqueue( d ) -bcd (1, 3, 3)

enqueue( e ) ebcd (1, 0, 4)

dequeue() e-cd (2, 0, 3)

enqueue(f) efcd (2, 1, 4)

enqueue(g) ?

array

Implementing a queue with a circular array

Page 27: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

27

Increase length of array and copy? BAD

tail head

head tail

head = 2tail = 1size = 4e f c d

e f c d - - - -

0 1 2 3

enqueue(g) ?

Page 28: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

28

tail head

head tail

head = 2tail = 1size = 4

head = 0tail = 3size = 4

e f c d

c d e f - - - -

0 1 2 3

Increase length of array. Copy so that head moves to front.(GOOD)

enqueue(g)

Page 29: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

29

enqueue( element ){if ( queue.size == queue.length) {

// increase length of array

create a bigger array tmp[ ] // e.g. 2*lengthfor i = 0 to queue.length - 1

tmp[i] = queue[ (head + i) % queue.length ]head = 0queue = tmp

}queue[size] = elementqueue.size = queue.size + 1

}

Page 30: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

tail = (head + size – 1) % length

(head, tail, size)Initial state ---- (0, 3, 0)

enqueue( a ) a--- (0, 0, 1)

enqueue( b ) ab-- (0, 1, 2)

dequeue() -b-- (1, 1, 1)

dequeue() ---- (2, 1, 0)

array

What happens when size == 0 ?

tail head

Page 31: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

ADT’s, API’s & Java

The following are related, but quite different:

• ADT (abstract data type)

• Java API (application program interface)

• Java keyword interface

To be discussed much more at end of the course.

31

Page 32: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

ADT (abstract data type)

Defines a data type by the values and operations fromthe user’s perspective only. It ignores the details of theimplementation.

Examples:

• list• stack• queue• …

32

Page 33: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Java API

API = application program interface

Gives class methods and some fields, and commentson what the methods do. e.g.

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

33

Page 34: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

Java interface

• reserved word (nothing to do with “I” in “API”)

• like a class, but only the method signatures aredefined

34

Page 35: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

interface List<T> {void add(T)void add(int, T)T remove(int)boolean isEmpty()T get( int )int size()

:}

https://docs.oracle.com/javase/7/docs/api/java/util/List.html

Example: List interface

35

Page 36: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

class ArrayList<T> implements List<T> {

void add(T) { …. }void add(int, T) { …. }T remove(int) { …. }boolean isEmpty() { …. }T get( int ) { …. }int size() { …. }

:}

Each of the List methods are implemented.(In addition, other methods may be defined andimplemented.) 36

Page 37: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

class LinkedList<T> implements List<T> {

void add(T) { …. }void add(int, T) { …. }T remove(int) { …. }boolean isEmpty() { …. }T get( int ) { …. }int size() { …. }

:}

Each of the List methods are implemented.(In addition, other methods may be defined andimplemented.) 37

Page 38: queue ADT - McGill CIMlanger/250/9-queue-slides.pdf6 Stack push(e) pop() LIFO (last in, first out) Queue enqueue( e ) dequeue() FIFO (first in, first out) “first come, first serve”

More examples

• interface Listadd(i,e), remove(i), get(i), set(i), …..

• class Stackpush, pop(), ..

• interface Queueoffer( e ), poll (), ….

38